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

Flutter _TypeError问题求助:Null无法转为Map<String, dynamic>

解决Flutter中_TypeError: type 'Null' is not a subtype of type 'Map<String, dynamic>'错误

问题原因

错误出在UserModel.fromJson工厂方法中:直接调用Data.fromJson(json["data"])时,若json["data"]为null或非Map<String, dynamic>类型,会因Data.fromJson要求传入非空Map而触发类型不匹配异常。虽然当前打印的接口返回中data字段有值,但异常场景(如接口错误、网络波动)下data可能缺失或为null,必须做防御性处理。

解决方案

方案1:将UserModel的data字段改为可空类型

修改user_model.dart中的UserModel类,允许data为null,同时在fromJson中判断值的有效性:

class UserModel {
  Data? data; // 改为可空类型

  UserModel({
    this.data, // 移除required修饰符
  });

  factory UserModel.fromJson(Map<String, dynamic> json) => UserModel(
        data: json["data"] is Map<String, dynamic> 
            ? Data.fromJson(json["data"]) 
            : null, // 仅当data是Map时解析,否则设为null
      );

  // toJson方法保持不变
  Map<String, dynamic> toJson() => {
        "data": data?.toJson(),
      };
}

后续使用UserModel时,通过userModel.data?.xxx安全访问,或先判断if (userModel.data != null)再进行业务处理。

方案2:提供默认Data实例处理null场景

若需要保持UserModel.data为非空,可给Data类添加默认空实例,当json["data"]无效时使用:

// 在Data类中添加静态方法返回默认实例
class Data {
  // ... 原有字段和构造函数

  static Data empty() => Data(
        fullName: "NA",
        email: "NA",
        profileImageUrl: "NA",
        isAdmin: false,
        isEligible: false,
      );

  // ... 原有fromJson和toJson方法
}

// 修改UserModel的fromJson
factory UserModel.fromJson(Map<String, dynamic> json) => UserModel(
        data: json["data"] is Map<String, dynamic> 
            ? Data.fromJson(json["data"]) 
            : Data.empty(),
      );

这种方式保证UserModel.data始终不为null,避免后续业务逻辑中的空判断冗余。

方案3:在API服务层提前校验数据格式

在auth_api_service.dart解析UserModel之前,先校验response['data']的类型,拦截无效数据:

if (response['token'] is String && response['token'] != '') {
  final rawUserData = response['data'];
  if (rawUserData is Map<String, dynamic>) {
    final userModel = UserModel.fromJson(rawUserData);
    return {'token': response['token'], 'user': userModel};
  } else {
    // 抛出明确错误或返回默认值
    throw Exception('接口返回的用户数据格式无效');
  }
}

额外建议

  • 推荐使用json_serializable包自动生成序列化代码,减少手动编写fromJson/toJson时的错误,同时自动处理空值和类型校验。
  • 在自定义的CustomHttpService中统一处理接口返回异常,比如判断HTTP状态码、校验返回格式是否符合预期,提前拦截无效响应。

内容的提问来源于stack exchange,提问作者Ramith K S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:51:10