You need to enable JavaScript to run this app. Flutter开发:请求API遇List<dynamic>无法转Map<String,dynamic>错误求助
优惠活动
大模型
产品
解决方案
定价
更多

Flutter开发:请求API遇List<dynamic>无法转Map<String,dynamic>错误求助

报错本质说明

触发报错Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'的核心原因,是代码在调用模型类的fromJson方法时,错误传入了根级List结构,而非单个元素对应的Map结构。


代码现存问题逐点排查
  • 循环逻辑写反:原代码循环条件为i>obj.length,循环启动时i=0,永远不可能大于数组总长度,导致循环体完全不执行,数据解析流程中断
  • 类型层级混淆:目标接口返回的根JSON结构为数组,json.decode解析后的根值为List<dynamic>类型,仅数组内的每个元素才是符合fromJson入参要求的Map<String, dynamic>类型
  • 异常处理缺失:fetchData方法仅覆盖了状态码200的正常分支,未对非200状态码、网络请求失败的场景做异常抛出,导致FutureBuilder无法正确捕获错误状态
  • UI绑定缺失:代码中的ListView未设置itemCount参数,也未将解析完成的列表数据和ListTile的文本组件绑定,即使数据拉取成功也无法渲染出实际内容

修复后的完整实现代码
class _MyHomePageState extends State<MyHomePage> {
  final String apiUrl = "https://jsonplaceholder.typicode.com/users";

  Future<List<Post>> fetchData() async {
    http.Response res = await http.get(Uri.parse(apiUrl));
    if (res.statusCode == 200) {
      // 解析根级为List结构的返回值
      List<dynamic> responseList = json.decode(res.body);
      List<Post> posts = [];
      // 修正循环判断条件,遍历所有数组元素
      for(int i = 0; i < responseList.length; i++){
        // 逐个取出Map结构的元素传入fromJson方法
        Post post = Post.fromJson(responseList[i]);
        posts.add(post);
      }
      return posts;
    } else {
      // 非200状态抛出异常,供FutureBuilder捕获
      throw Exception('请求失败,状态码:${res.statusCode}');
    }
  }

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: FutureBuilder<List<Post>>(
          future: fetchData(),
          builder: (ctx, snapShot){
            // 加载中状态
            if(snapShot.connectionState == ConnectionState.waiting){
              return const CircularProgressIndicator();
            }
            // 请求错误状态
            if(snapShot.hasError){
              return Text('加载失败:${snapShot.error}');
            }
            // 请求成功,渲染列表
            final posts = snapShot.data ?? [];
            return ListView.builder(
              itemCount: posts.length,
              itemBuilder: (context, index){
                final currentPost = posts[index];
                return ListTile(
                  leading: const CircleAvatar(),
                  title: Text(currentPost.name),
                  subtitle: Text(currentPost.email),
                );
              }
            );
          },
        ),
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者Mohamed El Fwakhry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 19:45:05