无法删除 ListView Flutter 中的最后一项

Cannot remove the last item in the ListView Flutter

我有一个包含可观察列表的 ListView var cartItems = <CartItem>[].obs;,当我试图删除 ListView 中的最后一项时,出现错误 RangeError (index): Invalid value: Valid value range为空:0 并且已撤消。任何人都可以告诉我如何解决它?提前致谢。这是我保存 ListView 的代码:

return Obx(() {
      if (_cartController.isLoading == false) {
        if (_cartController.cartItems.length == 0) {
          return Center(
            child: Text("Your cart is empty."),
          );
        }
        return Scaffold(
          backgroundColor: Colors.white,
          body: ListView.separated(
            ...
            itemBuilder: (context, index) {
              return Slidable(
                endActionPane: ActionPane(
                  motion: ScrollMotion(),
                  children: [
                    SlidableAction(
                      onPressed: (context) {
                        setState(() {
                          _cartController.cartItems.removeAt(index);
                        });
                        _cartController
                            .removeFromCart(
                                userId: widget.user.id,
                                productId:
                                    _cartController.cartItems[index].item.id)
                            .then((value) {...});
                      },
                      ...
                    ),
                  ],
                ),
                child: GestureDetector(
                  onTap: () => Get.to(() => ProductDetailsScreen(
                      product: _cartController.cartItems[index].item)),
                  child: _itemCard(
                      cartItem: _cartController.cartItems[index], index: index),
                ),
              );
            },
            ...
          ),
          ...
        );
      } else {
        ...
      }
    });

问题出在您的 onPressed 函数上。 removeFromCart 方法有什么作用?我猜它正在调用一些 api。这里的问题是您正在使用 removeAt(index) 方法从 cartItems 数组中删除项目。然后你在你的控制器上调用 removeFromCart 方法。而且,该 removeFromCart 方法的参数包括 productId: _cartController.cartItems[index].item.id.

错误来自该行,当项目计数为 1 时,您的代码将执行以下操作:

  1. 删除 _cartController.cartItems.removeAt(index); 行索引 = 0 处的项目。
  2. 然后继续调用 _cartController.removeFromCart(),它的参数称为 productId。但是,现在您的 cartItems 数组是空的 - 您已经在上一步中删除了该项目。所以,它会抛出一个异常。

解决方案:仅在完成您的 api 调用后或 removeFromCart() 承诺完全填充时才删除特定索引处的 cartItem。