无法删除 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 时,您的代码将执行以下操作:
- 删除
_cartController.cartItems.removeAt(index);
行索引 = 0 处的项目。
- 然后继续调用
_cartController.removeFromCart()
,它的参数称为 productId
。但是,现在您的 cartItems
数组是空的 - 您已经在上一步中删除了该项目。所以,它会抛出一个异常。
解决方案:仅在完成您的 api 调用后或 removeFromCart()
承诺完全填充时才删除特定索引处的 cartItem。
我有一个包含可观察列表的 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 时,您的代码将执行以下操作:
- 删除
_cartController.cartItems.removeAt(index);
行索引 = 0 处的项目。 - 然后继续调用
_cartController.removeFromCart()
,它的参数称为productId
。但是,现在您的cartItems
数组是空的 - 您已经在上一步中删除了该项目。所以,它会抛出一个异常。
解决方案:仅在完成您的 api 调用后或 removeFromCart()
承诺完全填充时才删除特定索引处的 cartItem。