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

Flutter实现4个TextField填充服务端数据时报RangeError索引异常如何解决

错误原因
  • 控制器列表初始化逻辑错误:初始_controllers为空列表,仅调用1次add()方法后列表长度只有1,仅下标0合法。后续直接通过下标1/2/3赋值时,列表没有对应存储空间,直接触发范围错误。
  • 存在冗余逻辑:第一行_controllers.add(TextEditingController());新增的控制器,立刻被_controllers[0] = TextEditingController();覆盖,无实际作用。
  • 赋值逻辑有隐患:当前循环写法会给所有控制器赋值同一个name字段,若服务端返回的data长度超过4也会触发越界。
修复方案

首先修正控制器初始化逻辑,同时优化数据赋值的边界判断:

List<TextEditingController> _controllers = [];
 
@override
void initState() {
  super.initState(); // 符合Flutter规范,super调用放在initState开头
  // 直接生成包含4个控制器的列表,避免逐个赋值越界
  _controllers = List.generate(4, (_) => TextEditingController());

  sharedPreferences.getUser().then((onValue) {
    _bloc.getData(...).then((onValue) {
      // 取数据长度和4的最小值,避免循环越界
      int validLength = min(onValue.esd.data.length, 4);
      for (int i = 0; i < validLength; i++) {
        // 按索引取对应条目的name字段赋值
        _controllers[i].text = onValue.esd.data[i]['name'];
      }
      setState(() {});
    });
  });
}

额外补充优化点:在页面销毁时释放控制器,避免内存泄漏:

@override
void dispose() {
  for (var controller in _controllers) {
    controller.dispose();
  }
  super.dispose();
}

内容的提问来源于stack exchange,提问作者Hoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:09:01