问题描述
在我的示例项目中,我使用 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
类中,我定义了服务器返回的两个参数 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 无法将其转换为 >>> 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));