list - 在颤动中使用 list.remove(element) 时未在列表中删除项目
问题描述
添加元素后,我无法删除列表中的项目。
List<CartItem> _items = [];
FirebaseFirestore? _instance;
void add(BuildContext context, CartItem item) {
_items.add(item);
AuthService authService = Provider.of<AuthService>(context, listen: false);
Map<String, dynamic> cartMap = Map();
_items.forEach((CartItem item) {
cartMap['title'] = (item.product as Product).title;
cartMap['name'] = (item.product as Product).name;
});
_instance = FirebaseFirestore.instance;
_instance!
.collection('cart')
.doc(authService.getCurrentUser()) //need to get logged in account's id
.update({
'cartProduct': FieldValue.arrayUnion([cartMap])
}).then((value) {
print(_items.length);
notifyListeners();
});
}
void remove(BuildContext context, CartItem item) {
_items.remove(item);
AuthService authService = Provider.of<AuthService>(context, listen: false);
Map<String, dynamic> cartMap = Map();
cartMap['title'] = (item.product as Product).title;
cartMap['name'] = (item.product as Product).name;
_instance = FirebaseFirestore.instance;
_instance!.collection('cart').doc(authService.getCurrentUser()).update({
'cartProduct': FieldValue.arrayRemove([cartMap]),
}).then((value) {
print(_items.length);
notifyListeners();
});
}
在我添加(context,widget.product)和打印_items.length之后,结果是1但是,在我删除(context,widget.product)和打印_items.length之后,结果仍然是1。
Consumer<CartService>(
builder: (context, cart, child) {
Widget renderedButton;
if (cart.isProductAddedToCart(widget.product) == false) {
renderedButton = DefaultButton(
text: "Participate",
press: () {
print(cart.isProductAddedToCart(widget.product));
cartService.add(context, CartItem(product: widget.product));
print(cart.isProductAddedToCart(widget.product));
},
);
} else {
renderedButton = DefaultButton(
text: "Delete",
press: () {
print(cart.isProductAddedToCart(widget.product));
cartService.remove(
context, CartItem(product: widget.product));
print(cart.isProductAddedToCart(widget.product));
},
);
}
return renderedButton;
与上面的代码一样,remove() 方法应该删除使用 add() 方法添加到列表中的相同项目。
解决方案
只需将 remove() 更新为:(仅更改 _items.remove(item); 位置)
void remove(BuildContext context, CartItem item) {
AuthService authService = Provider.of<AuthService>(context, listen: false);
Map<String, dynamic> cartMap = Map();
cartMap['title'] = (item.product as Product).title;
cartMap['name'] = (item.product as Product).name;
_instance = FirebaseFirestore.instance;
_instance!.collection('cart').doc(authService.getCurrentUser()).update({
'cartProduct': FieldValue.arrayRemove([cartMap]),
}).then((value) {
/// todo check firebase collection's deletion success first
_items.remove(item);
print(_items.length);
notifyListeners();
});
}
推荐阅读
- javascript - 使用 XMLHttpRequest 方法访问 api 时自动设置为“OPTIONS”,但我将方法初始化为“POST、PUT、GET 或 DELETE”
- vb.net - GetResponse 不是 UWP 中 WebRequest 的成员
- android - 在根项目中找不到任务“组装”
- javascript - 在数组中查找对象的数组索引正在影响使用 grunt 的缩小和丑化
- android - 如何增加android中改造库的上传时间
- android - 找一个类似于网络音频API的android库
- javascript - 在 reactjs 中相对于其父级定位组件
- html - 图标真棒在同一行
- python - 网页抓取文本条
- ios - 单击按钮时将数据存储在 NSMutable 数组中