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
相关产品推荐
相关产品推荐

