How to return from a forEach loop in Dart?

时间:2018-05-14 17:40:09

标签: for-loop dart

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?

4 个答案:

答案 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而不是forEachforEach只是按照迭代顺序应用集合的每个元素。而是map函数在迭代后返回对象。

您可以像这样使用它

  bool nameExists(players, player) {
    players.forEach((f) {
      if (player.name == "Tony") {
        return true;
      }
    });

    return false;
  }