RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1119272
Accepted
Andrey Khan
Andrey Khan
Asked:2020-05-02 23:16:58 +0000 UTC2020-05-02 23:16:58 +0000 UTC 2020-05-02 23:16:58 +0000 UTC

将对象添加到列表 Flutter

  • 772

产品已添加到工作表,但不保存产品。热重启或切换页面时,工作表为空。

class ProductUi extends StatelessWidget { 
 ProductTest productTest;
  ProductUi(this.productTest);

  @override
  Widget build(BuildContext context) {
    final  productBloc = BlocProvider.of<ProductBloc>(context);
    return Scaffold(
      body: Container(
          child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(productTest.name),
            RaisedButton(
              onPressed: () {
                productBloc.add(AddToCart(productTest: productTest));
              },
              child: Text('add to cart'),
            ),
          ],
        ),
      )),
    );
  }
}

功能

 class CartService {
     List<ProductTest> cartProduct = [];
      Future addProduct(ProductTest productTest) async {
        return cartProduct.add(productTest);      
      }
    }

堵塞

class ProductBloc extends Bloc<ProductEvent, ProductState> {
      CartService cartService = CartService();
      ProductBloc({@required this.cartService});
      @override
      ProductState get initialState => ProductInitial();

      @override
      Stream<ProductState> mapEventToState(ProductEvent event) async* {
        if (event is AddToCart) {
          await cartService.addProduct(event.productTest);
        }
      }
    }

事件

class AddToCart extends ProductEvent {
      ProductTest productTest;   
      AddToCart({this.productTest});
      @override
      List<Object> get props => [];
    }

主屏幕

 class HomeScreenTest extends StatefulWidget {
      @override
      _HomeScreenTestState createState() => _HomeScreenTestState();
    }

class _HomeScreenTestState extends State<HomeScreenTest> {
  CartService cartService = CartService();

  @override
  Widget build(BuildContext context) {    
    return Scaffold(
      appBar: AppBar(
        title: Padding(
          padding: const EdgeInsets.only(top: 4),
          child: SizedBox(
            height: kToolbarHeight,
            child: Image.asset('assets/dafna_logo.png'),
          ),
        ),
        backgroundColor: Colors.blueGrey,
        elevation: 20,
      ),
      body: CategoryTest(),
    );
  }
}




  class CategoryTest extends StatefulWidget {
      @override
      _CategoryTestState createState() => _CategoryTestState();
    }

class _CategoryTestState extends State<CategoryTest> {
  CartService cartService = CartService();
  @override
  Widget build(BuildContext context) {
    BlocProvider.of<ProductBloc>(context)..add(LoadCategoriesEvent());
    return Scaffold(
      backgroundColor: Colors.blueGrey[400],
      body: SingleChildScrollView(
        child: Padding(
          padding: EdgeInsets.fromLTRB(20, 15, 20, 15),
          child: Column(
            children: <Widget>[
              Text('Категории'),
              BlocBuilder<ProductBloc, ProductState>(
                builder: (context, state) {
                  if (state is ProductLoaded) {
                    return categoryColumn(
                        state.categoriesTest, state.productTest);
                  } else {
                    return Container();
                  }
                },
              )
            ],
          ),
        ),
      ),
    );
  }

  Widget categoryColumn(
      List<CategoriesTest> categoriesTest, List<ProductTest> productTest) {
    return Column(
      children: categoriesTest.map((category) {
        return Card(
          color: Colors.blueGrey[300],
          elevation: 10.0,
          margin: EdgeInsets.fromLTRB(10, 10, 10, 10),
          child: InkWell(
            onTap: () {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => BlocProvider(
                          create: (context) =>
                              ProductBloc(cartService: cartService),
                          child: ProductList(
                            categoriesTest: category,                               
                          ))));
            },
            child: Container(
              padding: EdgeInsets.all(20),
              child: Column(
                children: <Widget>[
                  Text(
                    category.categoryname,
                  ),
                ],
              ),
            ),
          ),
        );
      }).toList(),
    );
  }


class ProductList extends StatefulWidget {
  CategoriesTest categoriesTest;
  ProductList({@required this.categoriesTest});

  @override
  _ProductListState createState() => _ProductListState();
}

class _ProductListState extends State<ProductList> {
  CartService cartService = CartService();

  @override
  Widget build(BuildContext context) {
    BlocProvider.of<ProductBloc>(context)..add(LoadProductListEvent());
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blueGrey,
      ),
      backgroundColor: Colors.blueGrey[100],
      body: SingleChildScrollView(
        child: Padding(
          padding: EdgeInsets.fromLTRB(20, 30, 20, 15),
          child: Column(
            children: <Widget>[
              BlocBuilder<ProductBloc, ProductState>(
                builder: (context, state) {
                  if (state is TableListLoaded) {
                    return tableListColumn(
                        state.productTest, widget.categoriesTest);
                  } else {
                    return Container();
                  }
                },
              )
            ],
          ),
        ),
      ),
    );
  }

  Widget tableListColumn(
      List<ProductTest> productTest, CategoriesTest categoriesTest) {
    return Column(
      children: productTest
          .where((product) => product.category == categoriesTest.categoryname)
          .map((product) {
        return Card(
          elevation: 10.0,

          child: InkWell(
            onTap: () {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => BlocProvider(
                          create: (context) =>
                              ProductBloc(cartService: cartService),
                          child: ProductUi(product))));
            },
            child: Container(
              padding: EdgeInsets.all(15),
              child: Column(
                children: <Widget>[
                  Image.network(product.image),
                  Text(product.name),
                ],
              ),
            ),
          ),
        );
      }).toList(),
    );
  }
}
flutter
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MiT
    2020-05-03T15:54:52Z2020-05-03T15:54:52Z

    您有一个类CartService,您在该类中创建该类的一个对象 ( CartService cartService = CartService();) ProductUi。这个对象只存在于这个类中。当这个类被销毁时(例如,热重启时或页面切换回来时),其中的对象也会被销毁。

    为避免这种情况,您需要CartService在小部件树的上方创建一个类对象并将其传递给构造函数:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      final CartService cartService = CartService();
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            body: Center(
              child: SecondRoute(cartService),
            ),
          ),
        );
      }
    }
    
    class CartService {
      List<ProductTest> cartProduct = [];
      void addProduct(ProductTest productTest) {
        cartProduct.add(productTest);
      }
    }
    
    class ProductTest {
      final String name;
      ProductTest(this.name);
    }
    
    class SecondRoute extends StatelessWidget {
      final CartService cartService;
      SecondRoute(this.cartService);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Second Route"),
          ),
          body: Center(
            child: RaisedButton(
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) =>
                            ProductUi(ProductTest("name"), cartService)));
              },
              child: Text("Go Next"),
            ),
          ),
        );
      }
    }
    
    class ProductUi extends StatelessWidget {
      final ProductTest productTest;
      final CartService cartService;
      ProductUi(this.productTest, this.cartService);
    
      @override
      Widget build(BuildContext context) {
        final productList = cartService.cartProduct;
        return Scaffold(
          body: Container(
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(productTest.name),
                  RaisedButton(
                    onPressed: () {
                      cartService.addProduct(productTest);
                      productList.forEach((v) => print(v.name));
                      print("----");
                    },
                    child: Text('add to list'),
                  ),
                  RaisedButton(
                    child: Text('go back'),
                    onPressed: () {
                      Navigator.pop(context);
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    

    或者创建一个类CartService Singleton(为类的实例提供全局访问点,一个不可破坏的对象)并在任何地方使用它(我提请您注意,您不应该Singleton那样创建它,因为它占用内存空间,它包含的物体越多,他将占据的地方就越多):

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      final CartService cartService = CartService();
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            body: Center(
              child: SecondRoute(),
            ),
          ),
        );
      }
    }
    
    class CartService {
      static final CartService _singleton = CartService._internal();
      factory CartService() => _singleton;
      CartService._internal();
    
      List<ProductTest> cartProduct = [];
      void addProduct(ProductTest productTest) {
        cartProduct.add(productTest);
      }
    }
    
    class ProductTest {
      final String name;
      ProductTest(this.name);
    }
    
    class SecondRoute extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Second Route"),
          ),
          body: Center(
            child: RaisedButton(
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) =>
                            ProductUi(ProductTest("name"))));
              },
              child: Text("Go Next"),
            ),
          ),
        );
      }
    }
    
    class ProductUi extends StatelessWidget {
      final ProductTest productTest;
      ProductUi(this.productTest);
    
      final CartService cartService = CartService();
    
      @override
      Widget build(BuildContext context) {
        final productList = cartService.cartProduct;
        return Scaffold(
          body: Container(
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(productTest.name),
                  RaisedButton(
                    onPressed: () {
                      cartService.addProduct(productTest);
                      productList.forEach((v) => print(v.name));
                      print("----");
                    },
                    child: Text('add to list'),
                  ),
                  RaisedButton(
                    child: Text('go back'),
                    onPressed: () {
                      Navigator.pop(context);
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    

    为了在应用程序重新启动时保存数据,需要使用数据库,从中保存和加载数据。

    • 1

相关问题

  • 1 秒后打印每个列表值

  • 颤振函数调用

  • 如何将代码分配给参数

  • 如何在字符串中放置空格?

  • 更改 Firestore 中的布尔值

  • 显示数据

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5