Dart不了解forEach应该如何工作

我只是想使用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,true,false]

zyfvip 回答:Dart不了解forEach应该如何工作

您可以在此处List.forEach unable to modify element?

中查看为什么无法更新forEach中的值的答案。
  

Dart没有变量引用,所有元素都作为对对象而不是变量的引用传递。 (换句话说,Dart像Java和JavaScript一样纯粹是“按需共享”)。

     

这意味着forEach回调的e参数只是一个普通的局部变量,对其赋值在回调之外没有任何作用。迭代器也是如此:它们返回可迭代对象中的值,但此后没有对可迭代对象的引用。

您可以像创建列表一样使用filled方法执行所需的操作。

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

,

forEach元素无法修改列表中的实际元素。假设此代码:

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

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

print("List: $list");

输出仍然是:

List: [false,false]

所以您可以使用索引的for

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

或将其映射并重新分配:

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

您将获得:

List: [false,false]

,

如上所述,forEach函数不会为您提供对列表的写访问权,它只是为您提供了值。更改forEach回调函数的参数对该函数调用无效,仅更改局部变量即可。

更改列表,必须直接将其存储到其元素插槽中。要么:

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

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

应该做这项工作。

本文链接:https://www.f2er.com/3126505.html

大家都在问