Flutter中服务端API响应建模出现类型不匹配错误如何解决
问题原因
json.decode() 仅会将JSON字符串解析为Dart原生的_InternalLinkedHashMap<String, dynamic>类型,不会自动转换为你自定义的AutoAuthenticateResponse业务模型实例,直接赋值会触发类型不匹配错误。
修复方案
步骤1:给模型类添加fromJson序列化方法
你需要手动为自定义模型添加JSON转实例的解析逻辑,修改后的模型代码如下:
class ServerResponse { final bool success; final String message; ServerResponse({ required this.success, required this.message, }); } class _AuthAutenticationData { final String id; _AuthAutenticationData({ required this.id, }); // 新增JSON解析方法 factory _AuthAutenticationData.fromJson(Map<String, dynamic> json) { return _AuthAutenticationData( id: json['id'] as String, ); } } class AutoAuthenticateResponse extends ServerResponse { final _AuthAutenticationData? data; AutoAuthenticateResponse({ required super.success, required super.message, this.data, }); // 新增JSON解析方法 factory AutoAuthenticateResponse.fromJson(Map<String, dynamic> json) { return AutoAuthenticateResponse( success: json['success'] as bool, message: json['message'] as String, // 请求成功时才解析data字段 data: json['success'] ? _AuthAutenticationData.fromJson(json['data']) : null, ); } }
步骤2:修改接口调用处的解析逻辑
把原来直接赋值的代码替换为调用fromJson方法解析:
Future<void> autoAuth() async { final url = Uri.parse('${this._baseURL.toString()}/auto-auth'); try { final response = await http.post(url, headers: { 'Authorization': 'SXXX', }); print(response.body); // 先把JSON字符串解析为Map,再转自定义模型 final Map<String, dynamic> jsonMap = json.decode(response.body); final AutoAuthenticateResponse responseBody = AutoAuthenticateResponse.fromJson(jsonMap); if (responseBody.success) { return setUser(User(id: responseBody.data!.id)); } setUser(null); } catch (error) { print(error); setUser(null); } }
可选优化
如果项目里模型类较多,手写fromJson容易出错,可以使用官方的json_serializable库自动生成序列化代码,减少手动编码的失误。
内容的提问来源于stack exchange,提问作者Rabbiot Rabbiot
相关产品推荐
相关产品推荐

