Dart空安全报错:String类型参数name不可为空但隐式默认值为null
问题原因
这个报错是Dart空安全校验触发的:你声明的name属性为不可空String类型,但放在了可选命名参数的位置,Dart默认可选命名参数未传值时默认值为null,和不可空类型的约束冲突,所以触发编译错误。
可选解决方案
- 方案1:给
name参数添加required修饰符,强制调用方必须传入该参数,最符合当前TodoItem的业务逻辑,无需修改其他代码:
// 仅修改构造函数即可 const TodoItem({Key? key, required this.name, this.isActive}) : super(key: key);
- 方案2:给
name设置非空默认值,适合允许不传name、有默认兜底内容的场景:
// 给name设置默认空字符串,也可以根据业务设置自定义默认值比如"待办事项" const TodoItem({Key? key, this.name = '', this.isActive}) : super(key: key);
- 方案3:如果业务确实允许
name为null,就把name属性改为可空类型,使用时做空判断处理即可:
// 第一步:修改属性类型为可空String final String? name; // 构造函数不用额外修改 const TodoItem({Key? key, this.name, this.isActive}) : super(key: key); // 第二步:使用时给默认值避免空值传入Text组件 Text( widget.name ?? '未命名待办', style: TextStyle(fontSize: 17, color: Colors.grey), )
关于加
?也无法赋值为null的说明 String?类型本身是允许赋值为null的,你之前操作失败大概率是因为修改属性为可空后,直接将可能为空的name传入了Text组件,Text的展示内容参数要求必须是非空字符串,所以会触发新的编译错误,只要像方案3里一样用??操作符给空值场景设置兜底内容即可解决。
内容的提问来源于stack exchange,提问作者sboom
相关产品推荐
相关产品推荐

