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

Dart中更新List<List<String>>内列表引发兄弟列表同步更新问题

Dart多维列表元素全部相同的问题:原因与修复

问题根源

你遇到的问题核心出在这一行:

List<List<String>> rooms = List.filled(2, <String>[]);

List.filled方法的特性是将第二个参数的同一个对象引用填充到列表的所有位置。也就是说,这里的两个rooms元素指向的是同一个空列表实例。

所以循环中:

  1. 第一次循环给这个列表添加['John','Chris']
  2. 第二次循环先clear()清空这个列表,再添加['Michael','Eli']
    最后rooms的两个元素自然都是这个列表的最终状态['Michael','Eli']。

你的usedTeachers克隆是没问题的,问题完全在多维列表的初始化方式上。

修复方案

只需要把多维列表的初始化方式换成List.generate,它会为每个索引创建一个独立的新列表:

List<List<String>> rooms = List.generate(2, (_) => <String>[]);

或者,如果你坚持用List.filled,可以在循环中为每个位置重新赋值新列表(这种方式稍显繁琐):

for (int roomIndex = 0; roomIndex < rooms.length; roomIndex++) {
  rooms[roomIndex] = []; // 替换成新的空列表
  rooms[roomIndex].addAll([usedTeachers.removeAt(0), usedTeachers.removeAt(0)]);
}

修复后的完整代码

void main(List<String> arguments) {
  List<String> teachers = [
    'John',
    'Chris',
    'Michael',
    'Eli',
    'Jerry',
    'Cary',
    'Jimmy'
  ];
  // 改用List.generate创建独立的内部列表
  List<List<String>> rooms = List.generate(2, (_) => <String>[]);

  List<String> usedTeachers = List.from(teachers);

  for (int roomIndex = 0; roomIndex < rooms.length; roomIndex++) {
    rooms[roomIndex].addAll([usedTeachers.removeAt(0), usedTeachers.removeAt(0)]);
  }
  print(rooms); // 输出:[[John, Chris], [Michael, Eli]]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:30:06