我的应用程序的某个部分需要在购物车中显示产品。
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 方法中运行。我试图打印上下文并且上下文仍然存在。所以我不知道发生了什么。
有什么办法可以实现这个功能吗?谢谢。