Flutter中List.firstWhere指定orElse返回Null报错,求正确用法
Dart中List.firstWhere方法的正确使用方式
报错原因
你遇到的错误本质是类型不匹配:List<City>的firstWhere方法要求orElse回调返回的类型必须是非可空的City,但你让它返回null,违反了Dart的类型安全约束,因此触发编译错误。
正确使用场景与写法
1. 确定匹配元素一定存在时
如果能保证列表中必有符合条件的元素,可以省略orElse参数。找不到元素时会直接抛出StateError:
City targetCity = _cities.firstWhere((element) => element.id == 1);
2. 可能找不到元素,但需要返回合法的City实例
若找不到匹配项时不想抛出异常,orElse必须返回一个有效的City对象,比如定义一个占位的默认城市:
City targetCity = _cities.firstWhere( (element) => element.id == 1, orElse: () => City(-1, "", "未找到城市", "", false), );
3. 确实需要在找不到时返回null
如果业务逻辑要求找不到时返回null,必须将列表的元素类型改为可空的City?,或者将原列表转换为可空类型列表:
// 方式1:直接声明可空类型列表 List<City?> _cities = []; City? targetCity = _cities.firstWhere( (element) => element?.id == 1, orElse: () => null, ); // 方式2:对非可空列表做类型转换 City? targetCity = _cities.cast<City?>().firstWhere( (element) => element?.id == 1, orElse: () => null, );
和firstWhereOrNull的对比
你提到的package:collection中的firstWhereOrNull是官方封装的便捷方法,它内部已经处理了可空类型的逻辑,无需手动修改列表类型,写法更简洁:
import 'package:collection/collection.dart'; City? targetCity = _cities.firstWhereOrNull((element) => element.id == 1);
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

