Дарт Не понимаю, как должен работать forEach - PullRequest
1 голос
/ 11 ноября 2019

Я просто хотел использовать forEach, чтобы установить все значения в List на false, но я не понимаю, почему это не работает. Я создал заполненный список с фиксированной длиной следующим образом:

List<bool> myList = List<bool>.filled(6, false);

Затем я устанавливаю одно значение в true:

setState(() => myList[3] = true);

Затем я пытаюсь снова сбросить все значения в false, но, как видно из вывода print, он не работает:

setState(() {
  myList.forEach((val) => val = false);
  print(myList);
});

I/flutter (29049): [false, false, false, true, false, false]

Ответы [ 3 ]

5 голосов
/ 11 ноября 2019

Вы можете проверить ответ, почему вы не можете обновить значения внутри forEach здесь: List.forEach не может изменить элемент?

Дарт не имеет переменнойссылки, все элементы передаются как ссылка на объект, а не на переменную. (Другими словами, Dart - это просто «вызов по совместному использованию», как в Java и JavaScript).

Это означает, что параметр e для обратного вызова forEach - это просто обычная локальная переменная, и присвоение ей имеетникакого эффекта за пределами обратного вызова. То же самое относится и к итераторам: они возвращают значение в итерируемом, но после этого оно не имеет обратной ссылки на итерируемое.

Вы можете делать то, что вы хотите, используя метод filled, который вы использовали длясоздать список.

setState(() {
  myList = List<bool>.filled(myList.length, false);
  print(myList);
});

0 голосов
/ 11 ноября 2019

Как указано выше, функция forEach не дает вам права на запись в список, она просто предоставляет вам значение. Изменение параметра функции обратного вызова forEach не действует вне этого вызова функции, оно просто меняет локальную переменную.

На изменяем список, который необходимо сохранить в слотах его элементовнепосредственно. Либо:

for (int i = 0; i < list.length; i++) list[i] = false;

или

list.fillRange(0, list.length, false);

должны выполнять эту работу.

0 голосов
/ 11 ноября 2019
Элемент

forEach не может изменить фактический элемент в списке. Предположим, этот код:

var list = [false, true, false, false];

list.forEach((item) {
    item = false;
});

print("List: $list");

Вывод по-прежнему:

List: [false, true, false, false]

Итак, вы можете использовать индексированный for:

for (int i=0; i < list.length; i++) {
    list[i] = false;
}

Или сопоставьте и переназначьте его:

var list = [true, true, false];
list = list.map((item) {
    return false;
}).toList();

Вы получите:

List: [false, false, false, false]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...