我经常在我的项目中使用.firstWhere((E element) -> bool) -> E
。在移植它以支持空安全性时,我不能很好地处理在List实例中找不到元素的情况。
.firstWhere
、.singleWhere
和.lastWhere
返回E
,而不是E?
,所以当处理列表不包含必需元素的情况时,除了从eg转换整个列表之外,没有其他方法可以返回null
。List<String>
to List<String?>
,这使得测试函数担心每个元素都可能为空,而这不可能是空的。在空安全之前,我只能使用orElse: () => null
,但是在空安全的情况下,orElse
必须返回E
类型的元素,因此需要进行麻烦的强制转换。
我是否必须在orElse
中使用每个类型都有一个null
替代,或者是否有其他方法来使列表检查支持带有null的缺失元素场景?
发布于 2021-09-13 13:31:03
您可以只使用firstWhereOrNull,它应该可以完全按照您的预期工作。
发布于 2021-09-13 13:12:38
解决方案是在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"
https://stackoverflow.com/questions/69161378
复制相似问题