You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:31:08