Перезапись добавления карты в Dart цикла For

#flutter #for-loop #dart #iteration #overwrite

#флаттер #для цикла #dart #итерация #перезаписать

Вопрос:

У меня проблема с итерацией карты.

Я пробовал это

 List testList = [];
Map<String, dynamic> testMap = new Map;
for (var i = 0; i < 3; i  ) {
    testMap.addAll({'name': 'name $i'});
    testList.add(testMap);
  }
print(testList);
 

насколько я понимаю, этот код равен,

 testList.add({'name': 'name 0'});
testList.add({'name': 'name 1'};
testList.add({'name': 'name 2'});
 

второй код работал просто отлично и дал результат, который я ожидал, но первый код этого не делает. и вот какой первый результат.

 [{name: name 2}, {name: name 2}, {name: name 2}]
 

таким образом, addAll добавляет новое, перезаписывая предыдущее. я попробовал другой подход, например testMap['name']='name $i';
, но он не сработал.
Интересно, что я сделал не так. Или есть лучший способ?

dartpad.dev

Комментарии:

1. Код не эквивалентен. Версия с addAll закрывает существующую name запись testMap на каждой итерации и добавляет три ссылки на один и тот же testMap экземпляр testList . Ваша вторая версия добавляет три отдельных Map экземпляра в testList .

Ответ №1:

Поскольку этот случай в dart передается по ссылке, вам необходимо создавать «новую» карту в каждом цикле. Нравится

 List testList = [];
for (var i = 0; i < 3; i  ) {
    Map<String, dynamic> testMap = new Map();
    testMap.addAll({'name': 'name $i'});
    testList.add(testMap);
  }
print(testList);
 

Комментарии:

1. это сработало просто отлично. спасибо за вашу помощь, сэр. я не знал, что он хранится не как значение, а как переменная.

2. Dart не передается по ссылке. Передача дротика по значению, где переданное значение является ссылкой на объект. Это потому, что все значения в Dart являются ссылками.. Это создает иллюзию для тех, кто новичок в программировании на таких языках, как C или C . В C (или C ) вы также можете передавать ссылку по значению, но это не будет означать, что вы передали ссылку по ссылке.. Не вводите людей в заблуждение, если вы не знаете, как работает Dart.