Flutter空安全下Null类型无法赋值给自定义类的报错如何解决?
问题根因
- 你的两处代码都不符合Flutter空安全规范:
- 数据模型类的非空属性没有被正确初始化,可选命名参数默认值为null,和非空类型冲突
getObj方法声明返回非空的MyClass类型,但firstWhere的orElse回调返回了null,类型不匹配
分步解决方案
第一步:修复数据模型类
你可以根据业务需求二选一:
方案A:属性允许为空
如果x、y允许为空,直接在类型后加?标记为可空类型:
class MyClass{ int? x; String? y; MyClass({this.x, this.y}); // 其余代码,注意使用x、y时要处理可空逻辑 }
方案B:属性不允许为空
如果x、y是必填字段,给构造函数参数加required标记,保证实例化时一定传值:
class MyClass{ int x; String y; MyClass({required this.x, required this.y}); // 其余代码 }
第二步:修复查询方法
根据业务是否允许查询不到结果的场景,二选一:
场景1:允许查询不到时返回null
首先把方法返回类型改为可空的MyClass?,再使用firstWhereOrNull即可,你之前用这个方法无效大概率是没改返回类型:
// 如提示firstWhereOrNull不存在,可手动导入package:collection/collection.dart MyClass? getObj(int id){ return list.firstWhereOrNull((obj) => obj.id == id); }
场景2:不允许返回null
如果业务逻辑保证一定能查到对应数据,或者查不到时要返回默认实例/抛异常,就不要在orElse里返回null:
MyClass getObj(int id){ return list.firstWhere( (obj) => obj.id == id, // 查不到返回默认实例 orElse: () => MyClass(x: 0, y: '未找到'), // 也可以选择抛异常:orElse: () => throw '未找到id为$id的对象' ); }
内容的提问来源于stack exchange,提问作者devabhishekpal
相关产品推荐
相关产品推荐

