首页 > 解决方案 > 在颤动中使用 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() 方法添加到列表中的相同项目。

标签: listfluttergoogle-cloud-firestore

解决方案


只需将 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();
});
}

推荐阅读