Flutter解析接口报List<dynamic>非Map<String,dynamic>子类型错误
问题根因
报错触发来自两处类型强转不匹配:
- 顶层响应转换逻辑错误:接口返回的是数组结构,转换逻辑默认按单对象
Map<String, dynamic>类型接收整个响应,直接把List<dynamic>往Map类型强转会直接抛错。 - 嵌套字段类型写死:自动生成的模型中
Value字段被定义为固定的Map<String, dynamic>类型,但实际接口返回的Value存在空数组、数字、字符串等非对象类型,嵌套解析时碰到非Map值就会触发子类型不匹配。
分步修复方案
1. 修正Dio请求与顶层响应转换逻辑
先确认Dio配置中responseType保持默认的ResponseType.json,不要添加强行把响应转成Map的自定义拦截器,转换时明确按数组结构遍历处理:
Future<List<Autogenerated>> fetchBusinessList() async { final Dio dio = Dio(); // 其余Dio基础配置(超时、拦截器等)按原有逻辑保留即可 final Response response = await dio.post( '你的业务网关接口路径', data: {/* 请求参数按实际业务传 */}, ); if (response.statusCode == 200) { // 明确将顶层响应当做数组遍历,每一项单独转模型 return (response.data as List<dynamic>) .map((item) => Autogenerated.fromJson(item as Map<String, dynamic>)) .toList(); } throw Exception('接口请求异常,状态码:${response.statusCode}'); }
2. 修正模型类的多类型字段定义
不要直接使用自动生成的固定类型模型代码,将类型不固定的value字段改为dynamic,取消强转逻辑:
class Autogenerated { // 其余类型固定的字段(比如id、title、createTime等)按原有定义保留 final dynamic value; // 替换原有写死的Map<String, dynamic>类型,兼容所有返回值类型 Autogenerated({ // 其余固定字段按原有要求传 required this.value, }); factory Autogenerated.fromJson(Map<String, dynamic> json) { return Autogenerated( // 其余固定字段正常解析,比如id: json['id'] as String? value: json['value'], // 直接赋值,不要做Map类型强转 ); } }
3. 列表渲染时做类型兼容处理
在ListView的item构建逻辑中,针对不同类型的value做分支渲染,避免渲染时报错:
// 封装value的渲染组件,适配所有返回类型 Widget buildValueDisplay(dynamic value) { if (value is List && value.isEmpty) { return const Text('暂无有效数据'); } else if (value is Map) { // 对象类型按业务需要取对应字段展示,示例取desc字段 return Text(value['desc']?.toString() ?? ''); } else if (value is num) { return Text('数值:$value'); } else if (value is String) { return Text(value); } return const SizedBox.shrink(); }
注意:后端接口同字段返回多类型属于不规范设计,修复后建议和后端对齐字段类型规范,从源头减少类型兼容成本。
内容的提问来源于stack exchange,提问作者SaDev
相关产品推荐
相关产品推荐

