Flutter JSON解析报错:Null不是Map<String,dynamic>子类型问题求助
修复Flutter中ServiceModel解析null data字段的类型转换错误
问题原因
当接口返回data: null时,你的ServiceModel中data字段被定义为非空的Map<String, dynamic>,Dart的类型安全机制不允许将null赋值给非空类型,因此抛出type 'Null' is not a subtype of type 'Map<String, dynamic>'异常。
修复步骤
1. 修改Model的字段类型
将data字段改为可空类型,允许接收null值:
class ServiceModel { final bool success; final Map<String, dynamic>? data; // 改为可空Map类型 final String? error; ServiceModel({ required this.success, this.data, // 移除required修饰符 this.error, }); }
2. 调整fromJson构造函数
在解析data时,显式处理null情况,避免强制类型转换报错:
factory ServiceModel.fromJson(Map<String, dynamic> json) { return ServiceModel( success: json['success'] as bool, // 允许将null转为可空Map类型 data: json['data'] as Map<String, dynamic>?, error: json['error'] as String?, ); }
3. 适配实体类场景(如果data对应具体Model)
如果data是某个具体实体类(比如UserModel),同样要将其改为可空类型,并在解析时判断null:
class ServiceModel { final bool success; final UserModel? data; // 可空实体类类型 final String? error; ServiceModel({required this.success, this.data, this.error}); factory ServiceModel.fromJson(Map<String, dynamic> json) { return ServiceModel( success: json['success'] as bool, // 仅当data不为null时才解析实体类 data: json['data'] != null ? UserModel.fromJson(json['data'] as Map<String, dynamic>) : null, error: json['error'] as String?, ); } }
UI层错误信息展示
解析完成后,通过success状态判断是否展示错误信息:
// 假设接口返回的JSON已转为Map<String, dynamic> final responseJson = await yourApiCall(); final serviceModel = ServiceModel.fromJson(responseJson); if (serviceModel.success) { // 处理正常数据逻辑,注意先判断data是否为null if (serviceModel.data != null) { // 操作data内容 } } else { // 展示错误提示 showDialog( context: context, builder: (_) => AlertDialog( title: const Text('请求失败'), content: Text(serviceModel.error ?? '未知错误'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('确定'), ), ], ), ); }
内容的提问来源于stack exchange,提问作者Anand c
相关产品推荐
相关产品推荐

