2

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

.firstWhere,.singleWhere和return ,在处理 List 不包含必需元素的情况时,除了从例如转换整个列表之外没有其他方法可以.lastWhere返回。这使测试功能担心每个元素都可能为空,而这是不可能的。在 null 安全之前,我只能使用但 null 安全必须返回类型的元素,因此需要麻烦的转换。EE?nullList<String>List<String?>orElse: () => nullorElseE

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

4

2 回答 2

7

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

于 2021-09-13T13:31:02.717 回答
2

解决方案是在类型上创建一个扩展Iterable

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

然后像这样使用它:

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"

在 DartPad 上尝试完整的示例

于 2021-09-13T13:12:37.717 回答