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

k4aesqcs  于 2023-02-20  发布在  Flutter
关注(0)|答案(4)|浏览(272)

在我的示例项目中,我使用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>);
dsekswqp

dsekswqp1#

您的响应JSON为空或包含不正确的内容。这就是Dart无法将其转换为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>);

return LoginResponse.fromJson(response.data);
zbwhf8kr

zbwhf8kr2#

你得到了一个空响应。2试试这个代码,看看错误是否仍然存在。

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

uyhoqukh3#

使用json.decode()从json字符串中获取Map〈String,dynamic〉对象。
将行return loginModelFromJson(response.data as Map<String, dynamic>);更新为return loginModelFromJson(json.decode(response.data));

4xy9mtcn

4xy9mtcn4#

Map<String, dynamic> data = someData != null ? YourData as Map<String, dynamic> : {};

相关问题