Flutter ConcurrentModificationError问题:迭代时并发修改列表求助
问题分析与解决
报错原因
- 你写的
Map tasksCopy = tasks;根本没创建真正的副本,这两个变量指向的是同一个Map对象,遍历tasksCopy时修改原tasks,本质还是在遍历过程中修改原集合,必然触发并发修改错误。 - 就算复制了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
相关产品推荐
相关产品推荐

