在我的示例项目中,我使用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>);
4条答案
按热度按时间dsekswqp1#
您的响应JSON为空或包含不正确的内容。这就是Dart无法将其转换为
Map<String, dynamic>
的原因。您必须手动执行此操作变更
至
zbwhf8kr2#
你得到了一个空响应。2试试这个代码,看看错误是否仍然存在。
uyhoqukh3#
使用
json.decode()
从json字符串中获取Map〈String,dynamic〉对象。将行
return loginModelFromJson(response.data as Map<String, dynamic>);
更新为return loginModelFromJson(json.decode(response.data));
4xy9mtcn4#
Map<String, dynamic> data = someData != null ? YourData as Map<String, dynamic> : {};