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

Dol*_*rma 9 dart flutter riverpod flutter-freezed

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

getting type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast
Run Code Online (Sandbox Code Playgroud)

服务器响应数据:

getting type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast
Run Code Online (Sandbox Code Playgroud)

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

{
  "message": "test message",
  "statusCode": 1
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

我在这行方法中遇到了前面提到的错误getResponse

return loginModelFromJson(response.data as Map<String, dynamic>);
Run Code Online (Sandbox Code Playgroud)

Tro*_*ers 6

您的响应 JSON 为空或包含不正确的内容。这就是为什么 Dart 无法将其转换为Map<String, dynamic>. 你必须手动完成

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

改变

return loginModelFromJson(response.data as Map<String, dynamic>);
Run Code Online (Sandbox Code Playgroud)

return LoginResponse.fromJson(response.data);
Run Code Online (Sandbox Code Playgroud)