我有一個包含可觀察串列的 ListView var cartItems = <CartItem>[].obs;,當我嘗試洗掉 ListView 中的最后一項時,出現錯誤RangeError (index): Invalid value: Valid value range is empty: 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 {
...
}
});
uj5u.com熱心網友回復:
問題在于您的onPressed功能。該removeFromCart方法有什么作用?我認為它正在呼叫一些 api。這里的問題是您正在cartItems使用removeAt(index)方法從陣列中洗掉專案。然后你removeFromCart在你的控制器上呼叫方法。并且,該removeFromCart方法的引數包括
productId: _cartController.cartItems[index].item.id.
錯誤來自該行,當專案數為 1 時,您的代碼將執行以下操作:
- 它在線洗掉索引 = 0 處的專案
_cartController.cartItems.removeAt(index);。 - 然后繼續呼叫
_cartController.removeFromCart()具有稱為 的引數的呼叫productId。但是,現在您的cartItems陣列是空的 - 您已經在上一步中洗掉了該專案。所以,它會拋出例外。
解決方案:僅在完成 ??api 呼叫后或當removeFromCart()承諾已滿時才洗掉特定索引處的購物車專案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/393283.html
