提供者已使用异步更新后,具有未来构建器的窗口小部件不会删除窗口小部件

时间:2020-10-09 06:03:06

标签: flutter

我已经学习2-3个月了,我感到在理解状态管理方面已经达到了一个基本的障碍。不幸的是,这篇文章会很长,所以请和我一起裸露,希望我能提出正确的细节。

问题定义 我在购物车中有一个小部件列表,在我单击减号的那一点上,它只剩下1个,必须将其删除。无论我怎么尝试,都无法删除该小部件。如果我单击“后退”按钮并返回购物车,则该商品将不再显示。

我考虑了其他方法,例如处理小部件(似乎不起作用),并且我正忙于实现可视性Show/hide widgets in Flutter programmatically 但这不是正确的方法。如果我对提供者,changeNotifiers,异步和将来的构建者的理解正确,则以下方法应该有效,并且我认为它是我通行的基础,以了解为什么它不起作用工作。

概述:这个想法是使用CartItemWidget上的减号按钮来调用更新存储在本地设备上的Json的方法,然后在ProductProvider中重新填充List cartProdList,该调用 notifyListeners(),然后应将其传播到使用该提供程序的所有地方。现在,我已经成功地使用了5次此模式,这次唯一的不同是它将删除一个我以前没有做过的小部件。但是,如果将来基于相同的提供程序,这应该可以动态地起作用吗?

函数调用顺序

CartItemWidget.onPressed:()

通话>>>

ProductProvider.cartMinusOne(String id)

通话>>>

ProductProvider.Future<List<Product>> cartProducts()

代码在这里。我也不介意对我在所有方面都可以做得更好的事情发表评论。

CartWidget


    class CartWidget extends StatefulWidget {
      @override
      _CartWidgetState createState() => _CartWidgetState();
    }
    
    class _CartWidgetState extends State<CartWidget> {
      var providerOfProd;
      ProductProvider cartProdProvider = new ProductProvider();
      @override
      void initState() {
        _productsList = new ProductsList();
        super.initState();
        providerOfProd = Provider.of<ProductProvider>(context, listen: false).cartProducts();
      }
    
      @override
      Widget build(BuildContext context) {

    
    ........
    Column(children: <Widget>[
          FutureBuilder(
                        future: providerOfProd,
                        builder: (context, snapshot) {
                          switch (snapshot.connectionState) {
                            case ConnectionState.waiting:
                              return Container(
                                width: 0,
                                height: 0,
                              );
                            case ConnectionState.done:
                              return ListView.separated(
 ..............
                                },
                                itemBuilder: (context, index) {
                                  return CartItemWidget(
                                    product: cartProdProvider.cartProdList.elementAt(index),
                                    heroTag: 'cart',
                                    quantity: cartProdProvider.cartProdList.elementAt(index).cartqty,
                                    key: UniqueKey(),
                                  );
                                },
                              ); 
    
    .........

CartItemWidget


    class CartItemWidget extends StatefulWidget {
      CartItemWidget({Key key, this.product, this.heroTag, this.quantity = 1}) : super(key: key);
    
      // ProductProvider cartProd = new ProductProvider();
      String heroTag;
      Product product;
      int quantity;
    
      @override
      _CartItemWidgetState createState() => _CartItemWidgetState();
    }
    
    class _CartItemWidgetState extends State<CartItemWidget> {
      @override
      Widget build(BuildContext context) {
        return Consumer<ProductProvider>(
          builder: (context, productProv, _) => InkWell(

            child: Container(
    .............
                child: Row(
                  children: <Widget>[
    .............
                              IconButton(
                                onPressed: () {
                                  setState(() {
                                    productProv.cartMinusOne(widget.product.id);
                                    widget.quantity = this.decrementQuantity(widget.quantity);
                                  });
                                }
    .............

ProductProvider


    class ProductProvider with ChangeNotifier {
      ProductProvider() {
        cartProducts();
      }
    
    List<Product> cartProdList;
    
    cartMinusOne(String id) async {

//Code to minus item,then return as a string to save as local jason

        var test = jsonEncode(cartList);
        saveLocalJson(test, 'cart.json');
        cartProducts();
        notifyListeners();
      }
    
    Future<List<Product>> cartProducts() async {
        String jsonString = await JsonProvider().getProductJson();
        String cartString = await getCartJson();

        var filterProdList = (json.decode(jsonString) as List).map((i) => Product.fromJson(i)).toList();

//code to get match cart list to product list

        cartProdList = filterProdList.where((element) => element.cartqty > 0).toList();
        notifyListeners();
        return cartProdList;
      }
    ........................

0 个答案:

没有答案