Flutter报List<dynamic>非Map<String,dynamic>子类型错误解决方案
Flutter List与Map类型不匹配异常修复方案
报错信息
VERBOSE-2:ui_dart_state.cc(198)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>' #0 Api.requestPosting (package:listar_flutter_pro/api/api.dart:176:31) <asynchronous suspension> #1 HomeCubit.onLoad (package:listar_flutter_pro/blocs/home/home_cubit.dart:18:9) <asynchronous suspension>
问题原因
- WordPress REST API拉取文章列表的接口返回值为
List<dynamic>数组结构,原有代码错误将数组整体传入要求入参为Map<String, dynamic>的PostModel.fromJson方法,触发类型匹配错误 - 原有
requestPosting方法仅固定取返回数组的第一项返回单篇文章模型,无法支持全量文章拉取需求 - Cubit层已写好的
.map()遍历转PostModel的逻辑本身没有问题,不需要修改逻辑本身,仅需调整上下游类型适配即可 - 现有
PostModel.fromJson工厂方法针对单篇文章的解析逻辑完全可用,模型层不需要做任何改动
修复步骤
1. 调整Api层方法
将原有返回单个PostModel的方法改为返回文章列表,在Api层完成数组到模型列表的转换,适配接口返回结构:
// Api.dart static Future<List<PostModel>> requestPosting() async { final List<dynamic> result = await httpManager.get(url: posting); // 遍历数组每一项,显式转类型后调用原有fromJson方法,逻辑与原有map逻辑完全一致 return result.map((item) { return PostModel.fromJson(Map<String, dynamic>.from(item)); }).toList(); }
增加
Map<String, dynamic>.from(item)显式类型转换,避免dynamic隐式传参导致的类型兼容问题,从根源上杜绝同类报错。
2. 简化Cubit层调用
Api层调整后会直接返回转换完成的List<PostModel>,不需要在Cubit层重复做遍历转换,直接接收返回值即可传入组件渲染:
// cubit.dart final List<PostModel> posting = await Api.requestPosting(); // 此处posting可直接传入ListTitle组件使用
实现说明
- 全程未修改原有
.map()遍历的转换逻辑,仅调整了逻辑所在位置,符合需求 - 使用
.map()遍历转换接口返回的数组是REST API列表数据处理的标准实现,不需要手写for循环,代码简洁且性能可靠 - 所有类型均做显式声明,避免隐式类型推断带来的潜在异常
内容的提问来源于stack exchange,提问作者devreklim
相关产品推荐
相关产品推荐

