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

Flutter ConcurrentModificationError问题:迭代时并发修改列表求助

问题分析与解决

报错原因

  1. 你写的Map tasksCopy = tasks;根本没创建真正的副本,这两个变量指向的是同一个Map对象,遍历tasksCopy时修改原tasks,本质还是在遍历过程中修改原集合,必然触发并发修改错误。
  2. 就算复制了Map,里面的日期任务列表还是原列表的引用——forEach遍历列表时,不允许在遍历过程中修改列表结构(添加/删除元素),直接调用remove(task)会触发列表的并发修改错误。

解决代码与步骤

要避开遍历和修改同时进行的冲突,需要遍历集合的副本,而非原集合:

void addUnfinishedTasks() {
  String today = DateTime.now().toString().substring(0, 10);
  // 遍历原Map键的副本,避免遍历中Map结构变化干扰遍历
  List<String> dateKeys = List.from(tasks.keys);
  
  for (String key in dateKeys) {
    if (key != today) {
      // 遍历任务列表的副本,删除原列表元素时不会影响遍历流程
      List<Event> tasksToCheck = List.from(tasks[key]!);
      
      for (Event task in tasksToCheck) {
        if (!task.done) {
          // 从原列表移除未完成任务
          tasks[key]!.remove(task);
          // 将任务移至今日列表
          if (tasks.containsKey(today)) {
            tasks[today]!.add(task);
          } else {
            tasks[today] = [task];
          }
        }
      }
      // 可选:删除空任务列表的日期键,清理无效数据
      if (tasks[key]!.isEmpty) {
        tasks.remove(key);
      }
    }
  }
  updateDataBase();
}

关键说明

  • List.from(tasks.keys):创建原Map键的独立副本,就算遍历中新增today键,也不会打断当前遍历。
  • List.from(tasks[key]!):创建任务列表的副本,遍历副本时修改原列表的元素,不会触发列表的并发修改错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:59:55