Flutter动态添加活动后重开触发RangeError(index)问题求助
问题原因
重开页面触发RangeError是因为加载初始目标时,activityControllers的长度没有和checkBoxValues、activityTexts同步:
- 初始化时
activityControllers固定生成2个控制器; - 当加载包含更多活动的初始目标时,
checkBoxValues和activityTexts被替换为更长的列表,但activityControllers仍保持2个的长度; - 页面build时,根据
checkBoxValues的长度生成输入框,当索引超过1时,activityControllers[index]就会因数组越界报错。
修复方案
修改initState中加载初始目标的逻辑,同步更新activityControllers的长度,同时处理旧控制器的释放:
@override void initState() { super.initState(); titleController = TextEditingController(); // 先根据初始数据初始化列表,而不是固定为2个 if (widget.initialGoal != null) { final initialGoal = widget.initialGoal!; titleController.text = initialGoal.title; checkBoxValues = List.from(initialGoal.activities); activityTexts = initialGoal.activityTexts; selectedImage = initialGoal.imagePath.isNotEmpty ? File(initialGoal.imagePath) : null; // 生成对应长度的控制器 activityControllers = List.generate(activityTexts.length, (index) => TextEditingController(text: activityTexts[index])); } else { // 没有初始数据时才用默认的2个 activityControllers = List.generate(2, (index) => TextEditingController(text: activityTexts[index])); } }
动态添加活动的逻辑当前是正确的,确保三个列表始终同步:
ElevatedButton( onPressed: () { setState(() { checkBoxValues.add(false); activityTexts.add(""); activityControllers.add(TextEditingController()); }); }, child: const Text("Neue Aktivität hinzufügen"), ),
额外注意事项
- 确保
Goal模型中activities和activityTexts的长度始终一致,否则也可能引发类似错误; dispose方法无需修改,它会遍历所有activityControllers元素完成释放。
内容的提问来源于stack exchange,提问作者user19922759
相关产品推荐
相关产品推荐

