Flutter遇RangeError(index):仅有效值为0:6索引错误,求代码排查
列表长度与报错索引不符的RangeError问题
我试过多种解决方案都没用,麻烦帮忙看看我的代码。明明列表长度是5(也试过长度为4的列表),却抛出RangeError(index): Invalid value: Only valid value is 0: 6的错误,列表长度和报错的索引完全没关系,找不到问题出在哪。
相关代码:
Consumer部分:
Consumer<ProductsProvider>(builder: (context, product, _) { List<Widget> widgets = []; if (product.prod!.isNotEmpty) { product.prod!.forEach((element) { log(" element price = ${element.price}"); log("value === ${value++}"); widgets.add(CustomerProductsWidget( isReseller: false, productData: element, )); }); } else { Container( alignment: Alignment.center, child: Text( "No Product Available", ), ); } return Center( child: Wrap( alignment: WrapAlignment.start, crossAxisAlignment: WrapCrossAlignment.center, children: widgets.toList(), ), ); }),
ProductsProvider部分:
class ProductsProvider extends ChangeNotifier { List<ProductData>? prod = []; updateProd({List<ProductData>? newProd}) { prod = newProd; notifyListeners(); } }
问题排查与解决方案:
- 检查
value变量的使用:你在遍历列表时修改了外部的value变量,如果这个变量被其他依赖索引的组件使用,多次重建后数值会累计超出预期。建议改成遍历内的局部索引,比如用asMap():product.prod!.asMap().forEach((index, element) { log(" element price = ${element.price}"); log("value === ${index}"); // 用局部索引替代外部value widgets.add(CustomerProductsWidget( isReseller: false, productData: element, )); }); - 排查
CustomerProductsWidget内部:报错的索引6大概率是这个子组件内部触发的,比如它访问了某个长度不足的列表的索引6。仔细检查该组件的代码,看是否有硬编码索引、或者动态计算索引超出数据源长度的情况。 - 修正Provider数据更新逻辑:避免
prod出现null的情况,更新方法改成:void updateProd({List<ProductData>? newProd}) { prod = newProd ?? []; // 确保列表始终非null notifyListeners(); } - 修复空列表处理:当前else分支的
Container没有添加到widgets中,空列表时Wrap的children为空,虽然和当前报错关联不大,但可以修正:} else { widgets.add(Container( alignment: Alignment.center, child: Text("No Product Available"), )); }
内容的提问来源于stack exchange,提问作者Muhammad Umair Saqib
相关产品推荐
相关产品推荐

