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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:05:17