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

Flutter调用API获取数据时类型转换报错:_InternalLinkedHashMap<String, dynamic>不是List的子类型

解决Flutter中map操作时_InternalLinkedHashMap<String, dynamic>不是List子类型的错误

看起来你在调用API解析List数据时踩了几个小坑,我帮你梳理下问题和对应的修复方案:

1. 变量名冲突与未正确使用响应对象

你的httpService.dart里有个明显的变量错误:

http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
  var response = await http.Response.fromStream(streamedResponse);
}
  • 首先streamedResponse是未定义的变量,你应该用前面获取到的response;
  • 其次你重新声明了var response,覆盖了原本的StreamedResponse对象,这会导致后续解析逻辑出错。

修复这部分代码:

http.StreamedResponse streamedResponse = await request.send();
if (streamedResponse.statusCode == 200) {
  var response = await http.Response.fromStream(streamedResponse);
}

2. 返回了空列表而非处理后的结果

你在方法最后返回的是return Posts;,这个Posts是你一开始声明的空列表,完全没用到你解析出来的posts数据,这会导致即使请求成功,页面也拿不到数据。

把返回语句改成:

return posts;

3. 确认接口返回的实际结构

虽然你说Postman返回的是纯数组,但如果上面的修复后还是报同样的类型错误,那大概率接口实际返回的是包裹着数组的Map结构,比如:

{
  "data": [
    { "Id": "14", "title": "Facebook vs instagram?" },
    { "Id": "15", "title": "Facebook vs instagram?" },
    { "Id": "16", "title": "Facebook vs instagram?" }
  ]
}

这种情况下,你需要先从Map中取出对应的List字段,比如:

final result = jsonDecode(response.body)['data'] as List;

4. 补充异常处理逻辑

你的代码缺少异常捕获和非200状态码的处理,这会导致出错时很难排查问题。建议补充:

try {
  // 现有请求逻辑
} catch (e) {
  print('请求出错详情: $e');
  rethrow; // 或者根据需求返回空列表
}

修复后的完整httpService.dart代码

class HttpService {
  final String postsURL = ""; // 替换成你的实际接口地址
  Future<List<Post>> getPosts() async {
    var request = http.MultipartRequest("POST", Uri.parse(postsURL));
    request.headers.addAll(headers); // 确保headers已正确定义(比如包含Content-Type等)
    try {
      http.StreamedResponse streamedResponse = await request.send();
      if (streamedResponse.statusCode == 200) {
        var response = await http.Response.fromStream(streamedResponse);
        // 注意:如果接口直接返回List用下面这行,否则改成jsonDecode(response.body)['你的数组字段名'] as List
        final result = jsonDecode(response.body) as List;
        List<Post> posts = result
            .map(
              (dynamic item) => Post.fromJson(item),
            )
            .toList();
        return posts;
      } else {
        throw Exception('请求失败,状态码: ${streamedResponse.statusCode}');
      }
    } catch (e) {
      print('获取帖子数据出错: $e');
      throw e; // 抛出异常让FutureBuilder处理加载错误状态
    }
  }
}

按照上面的步骤修复后,应该就能解决类型转换的错误,同时确保数据能正确传递给页面渲染列表了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:27:37