В дротике как добавить несколько списков в список? - PullRequest
0 голосов
/ 06 августа 2020

Я хочу добавить несколько списков в список. Длина внешнего l oop равна 2, а длина внутреннего l oop равна 2.

List matchName = [];
List a = [];
List b = [];
void getMatchName(GetUserMatchModelRes m) {
  matchName.clear();
  for (var i = 0; i < m.ObjectList.length; i++) {
    matchName.clear();
    matchName.add(
      m.ObjectList[i].ContactName,
    );
    print("i:$i");
    for (var j = 0; j < m.ObjectList[i].ContactPhones.length; j++) {
      print("j:$j");
      matchName.add(
        m.ObjectList[i].ContactPhones[j].MatchedContactName,
      );
    }
   a.add(matchName);
   print(a);
  }
}

Вывод, когда внешний l oop равен 0: [[a,b,c]]

Когда внешнее l oop равно 1: [[d,e,f],[d,e,f]]

Но я хочу [[a,b,c],[d,e,f]]

Как я могу этого добиться?

1 Ответ

0 голосов
/ 06 августа 2020

По сути, вы делаете:

var outer = <List<String>>[];
var inner = ['foo'];

outer.add(inner);
outer.add(inner);

Теперь outer имеет два элемента, которые ссылаются на тот же объект:

       +---+---+
outer: |   |   |
       +-|-+-|-+
         |   |
         v   v
       +-------+
inner: | 'foo' |
       +-------+     

Если вы измените inner, вы увидите изменение как в outer[0], так и в outer[1].

Чтобы избежать этого, вам нужно добавить отдельные объекты , чтобы их можно было изменять независимо . Либо создайте новые списки для добавления вместо изменения существующего:

var outer = <List<String>>[];

outer.add(['foo']);
outer.add(['foo']);

, либо добавьте копии:

var outer = <List<String>>[];
var inner = ['foo'];

outer.add([...inner]);
outer.add([...inner]);
...