Dart 列表中的空感知 .firstWhere、.singleWhere、.lastWhere?

Mar*_*ski 7 dart flutter dart-null-safety null-safety

.firstWhere((E element) -> bool) -> E我在我的项目中经常使用。当移植它以支持空安全时,我无法干净地处理在List实例中找不到元素的情况。

.firstWhere.singleWhere.lastWhere返回E,但E?在处理列表不包含所需元素的情况时则不然,除了null从例如转换整个列表之外没有其他方法可以返回。List<String>List<String?>使得测试函数担心每个元素可能为空,但事实并非如此。在空安全之前,我只能使用orElse: () => null,但是使用空安全orElse必须返回类型的元素E,因此需要麻烦的转换。

我是否必须null为要使用的每种类型提供替代品orElse,或者是否有其他方法可以使列表检查支持 null 的缺失元素场景?

nvo*_*igt 27

您可以只使用firstWhereOrNull,它应该完全按照您的预期工作。

  • 记得导入收藏。` import 'package:collection/collection.dart'; ` (19认同)

Gui*_*oux 6

解决方案是创建类型的扩展Iterable

extension IterableModifier<E> on Iterable<E> {
  E? firstWhereOrNull(bool Function(E) test) =>
      cast<E?>().firstWhere((v) => v != null && test(v), orElse: () => null);
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

final myList = <String?>['A', 'B', null, 'C'];
String? result = myList.firstWhereOrNull((e) => e == 'D');
print(result); // output: null
  
result = myList.firstWhereOrNull((e) => e == 'A');
print(result); // output: "A"
Run Code Online (Sandbox Code Playgroud)

在 DartPad 上尝试完整示例