You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]
      };
}

问题原因

  1. JSON序列化/反序列化不匹配:toJson方法将isChecked存入键为"task"的数组中,但fromJson方法却从键"isChecked"读取值,导致反序列化时json['isChecked']为null,而构造函数要求传入非空的bool类型,最终使isChecked被赋值为null。
  2. 空值未处理:fromJson未处理json['isChecked']为null的情况,直接将null传给构造函数的isChecked参数,违反了bool类型的非空约束。
  3. 状态切换依赖空值:处理函数中直接对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:25:48