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
相关产品推荐
相关产品推荐

