Flutter报错:‘Null’类型不是‘bool’类型的子类型 求助排查
Flutter复选框切换状态触发Null类型转换错误
点击复选框尝试将状态从false切换为true时,出现错误:Null类型不是bool类型的子类型。
相关代码
复选框处理函数
// my function for checkbox void checkBoxChanged(bool? value, int index) { setState(() { db.folderTask[index].isChecked = !db.folderTask[index].isChecked; }); db.updateDatabase(); }
FolderTask类代码
class FolderTask { String? name; bool isChecked = false; FolderTask({required this.name, required this.isChecked}); factory FolderTask.fromJson(json) { return FolderTask(name: json['name'], isChecked: json['isChecked']); } Map<String, dynamic> toJson() => { "name": name, "task": [isChecked] }; }
问题原因
- JSON序列化/反序列化不匹配:
toJson方法将isChecked存入键为"task"的数组中,但fromJson方法却从键"isChecked"读取值,导致反序列化时json['isChecked']为null,而构造函数要求传入非空的bool类型,最终使isChecked被赋值为null。 - 空值未处理:
fromJson未处理json['isChecked']为null的情况,直接将null传给构造函数的isChecked参数,违反了bool类型的非空约束。 - 状态切换依赖空值:处理函数中直接对
db.folderTask[index].isChecked取反,若该值为null,则!操作符无法作用于Null类型,触发类型转换错误。
解决方案
1. 修复JSON序列化/反序列化的键匹配
修改toJson方法,将存储的键改为"isChecked",与fromJson的读取键保持一致:
Map<String, dynamic> toJson() => { "name": name, "isChecked": isChecked, // 修正键名,与fromJson对应 };
2. 处理JSON反序列化的空值情况
在fromJson中添加空值判断,给isChecked设置默认值false:
factory FolderTask.fromJson(json) { return FolderTask( name: json['name'], isChecked: json['isChecked'] ?? false, // 空值时使用默认值false ); }
3. 优化复选框状态切换逻辑
直接使用复选框传入的value来更新状态,避免依赖可能为空的原有值:
void checkBoxChanged(bool? value, int index) { setState(() { db.folderTask[index].isChecked = value ?? false; // 用传入值,空值时设为false }); db.updateDatabase(); }
内容的提问来源于stack exchange,提问作者sonjuro
相关产品推荐
相关产品推荐

