You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:09:16