0

我的应用程序的某个部分需要在购物车中显示产品。

CartScreen 有一个 ListView 加载 CartItem 是 Dismissible 并且用户可以滑动以删除该项目,在该项目上它显示一个带有 UNDO 按钮的 Snackbar,该按钮只是将项目添加回列表。正如您在下面看到的,我使用提供程序将项目添加到 ListView:

购物车屏幕:

     ........
  Expanded(
        child: ListView.builder(
          itemBuilder: (context, index) {
            return CartItemWidget(
                //.values.toList() as cart is a Map
                id: cartProvider.cart.values.toList()[index].cartItemID,
                title: cartProvider.cart.values.toList()[index].title,
                price: cartProvider.cart.values.toList()[index].price,
                quantity: cartProvider.cart.values.toList()[index].quantity,
                imageUrl: cartProvider.cart.values.toList()[index].imageUrl,
                productID: cartProvider.cart.keys
                    .toList()[index]); //keys to get a list of keys
          },
          itemCount: cartProvider.getCartSize,
        ), 
        ........

购物车项目:

   class CartItemWidget extends StatelessWidget {
  final String id;
      final String title;
      final double price;
      final int quantity;
      final String imageUrl;
      final String productID;

 

  CartItemWidget(
      {this.id,
      this.title,
      this.price,
      this.quantity,
      this.imageUrl,
      this.productID});



 Widget build(BuildContext context) {

return Dismissible(
  key: ValueKey(
      id), 
  background: DismissibleBackground(),
  direction: DismissDirection.endToStart,
  

  onDismissed: (direction) {
    Provider.of<Cart>(context, listen: false).removeFromCart(productID);
    //show snackbar
    ScaffoldMessenger.of(context).removeCurrentSnackBar();
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text('$title removed from cart'),
        duration: Duration(seconds: 3),
      
      
        action: SnackBarAction(
          textColor: Colors.white,
          label: 'UNDO',
         onPressed: () => Provider.of<Cart>(context, listen: false)
              .addToCart(productID, title, price, imageUrl), 
        ),
      ),
    );
  },

上面我在 onDismissed() 内的 Snackbar 的 UNDO 操作中再次将产品添加到购物车,我收到此错误:

处理手势时引发了以下断言:查找已停用小部件的祖先是不安全的。

此时小部件的元素树的状态不再稳定。

要在其 dispose() 方法中安全地引用小部件的祖先,请通过在小部件的 didChangeDependencies() 方法中调用dependOnInheritedWidgetOfExactType() 来保存对祖先的引用。

抛出异常时,这是堆栈:#0 Element._debugCheckStateIsActiveForAncestorLookup。(package:flutter/src/widgets/framework.dart:3864:9) #1 Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3878:6) #2 Element.getElementForInheritedWidgetOfExactType (package:flutter/src /widgets/framework.dart:3905:12) #3 Provider._inheritedElementOf (package:provider/src/provider.dart:327:34) #4 Provider.of (package:provider/src/provider.dart:284:30 ) ... 处理程序:“onTap”识别器:TapGestureRecognizer#6111b debugOwner:GestureDetector 状态:准备好赢得竞技场 finalPosition:偏移(386.7,861.6) finalLocalPosition:偏移(66.2,25.5)
按钮:1 发送点击向下

我认为这是因为我在显示快餐栏并且用户单击按钮后,小部件已经被关闭但 idk。我仍然可以在 UNDO 按钮中运行其他代码,但不能在 Provider.of 方法中运行。我试图打印上下文并且上下文仍然存在。所以我不知道发生了什么。

有什么办法可以实现这个功能吗?谢谢。

4

0 回答 0