我只是想使用forEach
将List
中的所有值设置为false,但我不明白为什么它不能工作。我创建了一个固定长度的填充列表,如下所示:
List<bool> myList = List<bool>.filled(6, false);
然后,我将一个值设置为true:
setState(() => myList[3] = true);
然后,我尝试将所有值重新设置为
,但正如您从
setState(() {
myList.forEach((val) => val = false);
print(myList);
});
I/flutter (29049): [false, false, false, true, false, false]
发布于 2019-11-11 05:00:05
您可以检查为什么不能在forEach
中更新值的答案:List.forEach unable to modify element?
Dart没有变量引用,所有元素都作为对对象的引用传递,而不是对变量的引用。(换句话说,Dart与Java和JavaScript一样,纯粹是“按共享调用”)。
这意味着,forEach回调的e参数只是一个普通局部变量,而将赋值给它在回调之外没有任何影响。迭代器也是如此:它们返回迭代器中的值,但在迭代之后,它没有对可迭代性的引用。
您可以使用filled
方法来做您想做的事情,就像创建列表时一样。
setState(() {
myList = List<bool>.filled(myList.length, false);
print(myList);
});
发布于 2019-11-11 05:49:43
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]
发布于 2019-11-11 06:58:14
如上所述,forEach
函数不允许您对列表进行写访问,它只是为您提供了值。更改forEach
回调函数的参数在该函数调用之外没有任何影响,它只是更改了一个局部变量。
若要更改列表,必须将其直接存储到元素插槽中。以下任一项:
for (int i = 0; i < list.length; i++) list[i] = false;
或
list.fillRange(0, list.length, false);
应该做好这份工作。
https://stackoverflow.com/questions/58795675
复制相似问题