Flutter使用http调用API时HashMap无法转SubjectList类型报错如何解决
错误原因
你出现的类型不匹配报错由两个核心问题导致:
json.decode()执行后返回的是原始的Map<String, dynamic>结构,你没有调用自定义的fromMap转换方法,直接将Map类型赋值给SubjectList类型变量,触发了类型校验报错。- 接口返回的
data字段是科目数组,你当前定义的网络请求方法返回单个SubjectList类型不符合实际数据结构,且模型命名存在语义混淆:你定义的SubjectList实际对应的是单条科目数据,并非列表。
修正方案
1. 调整模型语义(可选但推荐)
将原SubjectList模型重命名为Subject,对应单条科目数据,避免后续混淆:
class Subject { Subject({ this.subject, this.score, this.progress, }); String? subject; double? score; String? progress; factory Subject.fromMap(Map<String, dynamic> json) => Subject( subject: json["subject"], score: json["score"].toDouble(), progress: json["progress"], ); Map<String, dynamic> toJson() => { "subject": subject, "score": score, "progress": progress, }; }
如果你不想修改模型名称,后续直接把示例中的Subject替换为SubjectList即可。
2. 修正网络请求方法的返回类型与解析逻辑
将请求方法返回值改为Future<List<Subject>>,解析时先提取外层data数组,再遍历转换为模型对象,同时增加基础的响应状态校验:
Future<List<Subject>> getSubjectList( String userId, String accountId) async { final response = await http .get(Uri.https(_baseUrl, 'v1/package/subject-details'), headers: { 'Content-Type': 'application/json', 'user-id': userId, 'account-id': accountId, }); // 先校验接口请求是否成功 if (response.statusCode == 200) { final Map<String, dynamic> responseMap = json.decode(response.body); // 校验业务返回状态成功 if (responseMap['success'] == true) { // 提取data数组,遍历转换为Subject模型 final List<dynamic> dataList = responseMap['data']; return dataList.map((item) => Subject.fromMap(item)).toList(); } } // 异常场景按需处理,比如返回空列表或抛出异常 return []; }
3. 可选兼容处理
如果存在score字段返回null的场景,可以把fromMap中的score赋值逻辑调整为兼容写法,避免空指针:
score: json["score"]?.toDouble(),
内容的提问来源于stack exchange,提问作者Febin Johnson
相关产品推荐
相关产品推荐

