I have this function
bool nameExists(players, player) {
players.forEach((f) {
if (f.data['name'].toLowerCase() == player.toLowerCase()) {
return true;
}
});
return false;
}
It always return false, even if the condition is satisfied.
Any ideas?
答案 0 :(得分:8)
无法从forEach
返回值。
只需使用for
循环。
bool nameExists(players, player) {
for(var f in players) {
if (f.data['name'].toLowerCase() == player.toLowerCase()) {
return true;
}
}
return false;
}
答案 1 :(得分:2)
我发现了另一个SO:
How to stop Dart's .forEach()?
其中一个回复说:
Dart不支持非本地返回,因此从回调返回不会破坏循环。它在jQuery中工作的原因是each()检查回调返回的值。 Dart forEach回调返回void。
我没有找到官方文档来提供链接。但它基于类似的问题,他们的答案以及代码的行为是有道理的。
此外,根据该链接中的其他答案,您需要执行此操作: 注意它使用“for in”循环而不是foreach。用于在C#或类似语言函数中作为foreach的函数。
bool nameExists(players, player) {
bool result = false;
for(var f in players) {
if (f.data['name'].toLowerCase() == player.toLowerCase()) {
result = true;
break;
}
}
return result;
}
或者,可以使用其他机制的示例来实现链接SO中的相同目标。
答案 2 :(得分:1)
对于此特定用例,您还可以使用any()
代替forEach()
,例如
bool nameExists(players, player) =>
players.any((f) => f.data["name"].toLowerCase() == player.toLowerCase());
答案 3 :(得分:0)
forEach
是 void方法,它不是返回类型函数。因此您应该使用map
而不是forEach
。 forEach
只是按照迭代顺序应用集合的每个元素。而是map
函数在迭代后返回对象。
您可以像这样使用它
bool nameExists(players, player) {
players.forEach((f) {
if (player.name == "Tony") {
return true;
}
});
return false;
}