GetX商品列表初始化引发索引错误:排查与修复方案
问题描述
我用GetX构建商品列表的响应式模型,在StatelessWidget的build方法里,列表初始化时为空,触发了索引错误(虽然列表实际有数据,但初始显示为空,之后会自动恢复正常)。我试过用try-catch处理,但catch块根本没触发。
相关代码
Widget代码
return GetX<CartController>( init: CartController(), builder: (controller) { try { return Text( "${StringConvert.toMoney(controller.totalByProduct[productId])}", style: kSmallTextBold, ); } catch (e) { return const Text("Error..."); } }, );
控制器代码
var totalByProduct = [].obs; fetchTotal() { List products = storage.read(StorageKeys.cartProducts); double currentValue = 0.0; List currentTotals = []; for (var item in products) { currentTotals.add(item['total'] * item['amount']); currentValue += item['total'] * item['amount']; } total.value = currentValue; totalByProduct.value = currentTotals; }
解决方案
初始化时填充默认值,避免空列表访问
在控制器的onInit生命周期里,先读取本地商品列表,初始化对应长度的默认值(比如0.0),再调用fetchTotal:var totalByProduct = <double>[].obs; @override void onInit() { super.onInit(); List products = storage.read(StorageKeys.cartProducts) ?? []; // 初始化和商品数量一致的默认值列表 totalByProduct.value = List.filled(products.length, 0.0); fetchTotal(); }在Widget中添加索引合法性校验
直接在builder里判断索引是否在有效范围内,替代try-catch(框架层会捕获越界异常,你的try-catch无法触发):return GetX<CartController>( init: CartController(), builder: (controller) { // 校验列表非空且索引合法 if (controller.totalByProduct.isEmpty || productId < 0 || productId >= controller.totalByProduct.length) { return Text("0.00", style: kSmallTextBold); } return Text( "${StringConvert.toMoney(controller.totalByProduct[productId])}", style: kSmallTextBold, ); }, );优化fetchTotal方法的空值处理
读取本地存储时加空值判断,同时校验商品字段的有效性,避免空指针:fetchTotal() { List products = storage.read(StorageKeys.cartProducts) ?? []; double currentValue = 0.0; List<double> currentTotals = []; for (var item in products) { double itemTotal = item['total'] ?? 0.0; int itemAmount = item['amount'] ?? 1; currentTotals.add(itemTotal * itemAmount); currentValue += itemTotal * itemAmount; } total.value = currentValue; totalByProduct.value = currentTotals; }
内容的提问来源于stack exchange,提问作者tekboxs
相关产品推荐
相关产品推荐

