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
相关产品推荐
相关产品推荐

