#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';
, но он не сработал.
Интересно, что я сделал не так. Или есть лучший способ?
Комментарии:
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.