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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:24:27