类型“Null”不是类型转换错误中“Map<String, dynamic>”类型的子类型

问题描述

在我的示例项目中,我使用 riverpod 包和 freezed 实现了项目。在下面的代码中,我可以成功从服务器获取数据,但是当我尝试使用 model.fromJson 时出现此错误

getting type 'Null' is not a subtype of type 'Map<String,dynamic>' in type cast

服务器响应数据:

{
  "message": "test message","statusCode": 1
}

login 模型来转换服务器响应的数据和结构:

LoginModel loginModelFromJson(Map<String,dynamic> str) => LoginModel.fromJson(str);

String loginModelToJson(LoginModel data) => json.encode(data.toJson());

@freezed
class LoginModel with _$LoginModel {
  const factory LoginModel({
    required LoginResponse response,}) = _LoginModel;

  factory LoginModel.fromJson(Map<String,dynamic> json) => _$LoginModelFromJson(json);
}

@freezed
class LoginResponse with _$LoginResponse {
  const factory LoginResponse({
    required String message,required int statusCode,}) = _LoginResponse;

  factory LoginResponse.fromJson(Map<String,dynamic> json) => _$LoginResponseFromJson(json);
}

LoginResponse 类中,我定义了服务器返回的两个参数 messagestatusCode。当我尝试使用此请求时,例如:

Future<LoginModel> getResponse(String mobileNumber) async {
  const endPoint = 'http://192.168.1.11/api';
  try {
    final response = await _read(dioProvider).get('${endPoint}/register');

    /*GETTING ERROR HERE*/
    return loginModelFromJson(response.data as Map<String,dynamic>);
  } on dioError catch (e) {
    ///
  }
}

我在 getResponse 方法的这一行收到了前面提到的错误

return loginModelFromJson(response.data as Map<String,dynamic>);

解决方法

您的响应 JSON 为空或包含不正确的内容。这就是 Dart 无法将其转换为 >>> df Price change Result 0 -4.8 -4.8 1 -3.8 -3.8 2 -2.8 NaN 3 -1.8 NaN 4 3.2 NaN 5 -0.8 NaN 6 -2.8 -2.8 7 -3.8 -3.8 8 5.2 NaN 9 7.2 NaN 10 9.2 NaN 11 11.2 NaN 12 13.2 13.2 13 15.2 15.2 14 -9.8 -9.8 15 -8.8 -8.8 16 -7.8 NaN 17 -6.8 NaN 18 -5.8 NaN 19 -4.8 NaN 的原因。您必须手动进行

Map<String,dynamic>

改变

LoginResponse _$LoginResponseFromJson(Map<String,dynamic> json) {
  return LoginResponse(
    message: json['message'] as String,statusCode: json['statusCode'] as int,);
}

return loginModelFromJson(response.data as Map<String,dynamic>);
,

您收到空响应。试试这个代码,看看错误是否仍然存在。

if(response.data!=null)
{return loginModelFromJson(response.data as Map<String,dynamic>);}
,

使用 json.decode() 从 json 字符串中获取 Map 对象。

将行 return loginModelFromJson(response.data as Map<String,dynamic>); 更新为 return loginModelFromJson(json.decode(response.data));