首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dart不理解forEach应该如何工作

Dart不理解forEach应该如何工作
EN

Stack Overflow用户
提问于 2019-11-11 04:45:09
回答 3查看 3.6K关注 0票数 4

我只是想使用forEachList中的所有值设置为false,但我不明白为什么它不能工作。我创建了一个固定长度的填充列表,如下所示:

代码语言:javascript
运行
复制
List<bool> myList = List<bool>.filled(6, false);

然后,我将一个值设置为true:

代码语言:javascript
运行
复制
setState(() => myList[3] = true);

然后,我尝试将所有值重新设置为

,但正如您从print输出中看到的那样,它无法工作:

代码语言:javascript
运行
复制
setState(() {
  myList.forEach((val) => val = false);
  print(myList);
});

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-11 05:00:05

您可以检查为什么不能在forEach中更新值的答案:List.forEach unable to modify element?

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

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

您可以使用filled方法来做您想做的事情,就像创建列表时一样。

代码语言:javascript
运行
复制
setState(() {
  myList = List<bool>.filled(myList.length, false);
  print(myList);
});
票数 5
EN

Stack Overflow用户

发布于 2019-11-11 05:49:43

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

代码语言:javascript
运行
复制
var list = [false, true, false, false];

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

print("List: $list");

产出仍然是:

List: [false, true, false, false]

所以你能做的就是使用一个索引的for

代码语言:javascript
运行
复制
for (int i=0; i < list.length; i++) {
    list[i] = false;
}

或者映射并重新分配它:

代码语言:javascript
运行
复制
var list = [true, true, false];
list = list.map((item) {
    return false;
}).toList();

你会得到:

List: [false, false, false, false]

票数 3
EN

Stack Overflow用户

发布于 2019-11-11 06:58:14

如上所述,forEach函数不允许您对列表进行写访问,它只是为您提供了值。更改forEach回调函数的参数在该函数调用之外没有任何影响,它只是更改了一个局部变量。

若要更改列表,必须将其直接存储到元素插槽中。以下任一项:

代码语言:javascript
运行
复制
for (int i = 0; i < list.length; i++) list[i] = false;

代码语言:javascript
运行
复制
list.fillRange(0, list.length, false);

应该做好这份工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58795675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档