类型 'Null' 不是类型转换错误中类型 'Map<String, dynamic>' 的子类型
Type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast error
在我的示例项目中,我使用 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
class 我定义了两个参数message
和statusCode
由服务器返回。当我尝试使用此请求时,例如:
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 无法将其转换为 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);
您得到的是空响应。试试这段代码,看看错误是否仍然存在。
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));
在我的示例项目中,我使用 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
class 我定义了两个参数message
和statusCode
由服务器返回。当我尝试使用此请求时,例如:
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 无法将其转换为 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);
您得到的是空响应。试试这段代码,看看错误是否仍然存在。
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));