Dart:更新 List<List<String>> 中的列表也会导致同级列表更新

Dart: updating a list inside a List<List<String>> causes a sibling list to be updated as well

提问人:MOHAMMAD RASIM 提问时间:5/31/2023 更新时间:5/31/2023 访问量:13

问:

在 Dart 中,如果我有一个多维字符串列表,并且我想将元素添加到内部列表中,它会导致所有列表都具有相同的元素,下面是一个重现该问题的最小示例:

void main(List<String> arguments) {
  List<String> teachers = [
    'John',
    'Chris',
    'Michael',
    'Eli',
    'Jerry',
    'Cary',
    'Jimmy'
  ];
  List<List<String>> rooms = List.filled(2, <String>[]);

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

  for (int roomIndex = 0; roomIndex < rooms.length; roomIndex++) {
    rooms[roomIndex].clear();
    rooms[roomIndex]
        .addAll([usedTeachers.removeAt(0), usedTeachers.removeAt(0)]);
  }
  print(rooms);
}

我的期望如下:

  • 在第一次迭代中,它将从列表中弹出/删除前 2 个元素并将它们添加到第一个列表中,因此它应该具有 ['John','Chris'];usedTeachers
  • 在第二次迭代中,它将从列表中弹出/删除第二个元素,并将它们添加到第二个列表中,因此它应该具有 ['Michael','Eli']usedTeachers

最终列表应如下所示:rooms

[['John','Chris'],['Michael','Eli']]

相反,它会导致以下结果:

[['Michael','Eli'],['Michael','Eli']]

因此,最终迭代始终会导致所有列表具有相同的元素

看起来像一些通过引用/按值传递的问题,但我在可能的情况下深入克隆列表,所以我不确定问题是什么

我做错了什么?

数组 列表 dart 按引用传递

评论


答:

0赞 MOHAMMAD RASIM 5/31/2023 #1

这似乎是由构造函数引起的,它用相同的元素(相同的内存地址)填充列表,所以当我更新元素时,它会反映在所有列表中 更改线路:List.filled

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

对此:

List<List<String>> rooms = List.generate(2, (index) => ['1', '2']);

解决问题