将orElse函数添加到firstWhere方法

ric*_*ard 12 dart

我试图将onElse函数添加到itterator.firstWhere方法但我无法正确获得语法.

我尝试过类似的东西

List<String> myList = 

String result = myList.firstWhere((o) => o.startsWith('foo'), (o) => null);
Run Code Online (Sandbox Code Playgroud)

但编译器有错误

预期1个位置参数,但发现2个

我确信这是一个简单的语法问题,但它让我难过

Wah*_*hyu 69

万一有人因为谷歌来到这里,搜索null如果firstWhere没有发现如何返回,当您的应用程序为Null Safe 时,使用新方法package:collectioncalled firstWhereOrNull

import 'package:collection/collection.dart'; // You have to add this manually, for some reason it cannot be added automatically

// somewhere...
MyStuff? stuff = someStuffs.firstWhereOrNull((element) => element.id == 'Cat');
Run Code Online (Sandbox Code Playgroud)

关于方法:https : //pub.dev/documentation/collection/latest/collection/IterableExtension/firstWhereOrNull.html

  • 由于某种原因, `package:collection/collection.dart` 没有自动导入,但在阅读本文并手动添加后,我的所有测试都再次通过。谢谢! (14认同)
  • 不要忘记将其作为依赖项添加到 pubspec.yaml 中:collection: ^1.16.0 (4认同)
  • 我很伤心,因为我必须对这个小功能再有一个依赖。Dart 还有很长的路要走。 (2认同)
  • 这会对某些人有所帮助,但并不能回答问题。问题涉及在“firstWhere”中实现“orElse”以及关于太多位置参数的编译器错误。 (2认同)

Gün*_*uer 27

'orElse'是一个命名的可选参数.

void main() {
  checkOrElse(['bar', 'bla']);
  checkOrElse(['bar', 'bla', 'foo']);
}

void checkOrElse(List<String> values) {
  String result = values.firstWhere((o) => o.startsWith('foo'), orElse: () => '');

  if (result != '') {
    print('found: $result');
  } else {
    print('nothing found');
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我只想补充说,不提供orElse方法不会返回null但抛出StateError:https://api.dartlang.org/stable/1.21.1/dart-collection/ListQueue/firstWhere.html (6认同)
  • 之前的评论不正确。从“orElse”返回“null”不会触发 StateError。因此,“orElse: () =&gt; null”不会触发 StateError 并且完全按预期工作。然而,像“orElse: null”这样的东西与保留参数相同,并且当“test”失败时默认为 StateError。 (3认同)
  • @WillHaslett,是的,Fabian 的说法是正确的。我怀疑我指的是一条已被删除的评论……但不能说我确实记得。 (2认同)
  • 这应该是公认的答案。OP要求语法。 (2认同)

Dor*_*val 18

使用cast<E?>(),您可以在不添加依赖项的情况下执行此操作:

void main() {
  List<String> myList = ["Hello", "World"];

  String? result = myList.cast<String?>().firstWhere((o) => o!.startsWith('foo'), orElse: () => null);

  print(result ?? "No result");
}
Run Code Online (Sandbox Code Playgroud)

你可以在dartpad上尝试一下。

  • 这实际上应该标记为答案!谢谢:3 (5认同)
  • 这难以置信。谢谢。 (2认同)