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

Flutter集成REST API报错:_Map<String,dynamic>非Iterable<dynamic>子类型

问题解决:Flutter Provider异常与API数据解析错误

错误原因分析

  1. 类型转换错误:报错type '_Map<String, dynamic>' is not a subtype of type 'Iterable<dynamic>',说明你的API返回的是JSON对象(Map),但代码中直接把它当作**数组(Iterable)**来遍历了。绝大多数后端API不会返回裸数组,而是用外层对象包裹数据列表(比如{"data": [...], "code": 200})。
  2. 未处理异常:FutureProvider未配置catchError,导致异步请求抛出异常时无法被捕获处理。

修复步骤及代码修改

1. 修正API数据解析逻辑(服务类)

修改ContentServices中的getCourses方法,先从返回的Map中提取数据列表,再进行遍历转换:

class ContentServices {
  ///Get Courses
  Future<List<ContentModel>> getCourses(BuildContext context) async {
    // 明确指定返回值为Map类型
    final Map<String, dynamic> response =
        await _helper.get(context, endPoint: '/api/admin/contentapi');
    
    // 从Map中取出数据列表(key需和API实际返回字段一致,比如'data'/'contents')
    final List<dynamic> contentData = response['data'];
    
    // 转换为ContentModel列表
    return contentData.map((item) => ContentModel.fromJson(item)).toList();
  }
}

如果API确实返回裸数组,需先检查ApiBaseHelper的get方法是否正确解析响应,若该方法误将数组转为Map,需优先修正ApiBaseHelper逻辑。

2. 给FutureProvider添加异常捕获

在使用FutureProvider的位置,添加catchError配置处理异步异常:

FutureProvider<List<ContentModel>>(
  create: (context) => ContentServices().getCourses(context),
  // 捕获异常并返回兜底值(或进行错误提示)
  catchError: (context, error) {
    print('加载内容失败:$error');
    // 返回空列表避免UI崩溃
    return [];
  },
  child: YourChildWidget(),
);

额外验证建议

  • 用Postman或浏览器调用API,确认返回的JSON结构,确保response['data']是正确的列表字段。
  • 若Model类的courseModelFromJson方法未实际使用,可考虑删除以避免混淆。

内容的提问来源于stack exchange,提问作者John Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:14:59