Flutter加载API下拉数据报_InternalLinkedHashMap类型不匹配错误
问题原因
运行时抛出type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>'异常的核心原因是接口响应解析逻辑错误:
从控制台打印的接口返回结构可以看到,响应最外层是Map类型对象,结构如下:
{ "Result": "Success", "Remarks": "Records Found Successfully", "data": [ {"reason": "DOOR LOCKED"}, {"reason": "CUSTOMER NOT INTERESTED"}, // 其余待选原因 ] }
你在_getPendingRsn方法中直接将解码后的整个外层Map对象赋值给了声明为List类型的datalist变量,类型不匹配直接触发类型转换异常,DropdownButton拿不到正确的列表数据,自然无法渲染下拉选项。
修复方案
- 修正接口响应解析逻辑,从响应Map中取出
data字段对应的数组,再赋值给datalist,不要直接赋值整个响应对象。修改_getPendingRsn方法内的响应处理代码:if (response.statusCode == 200) { Map<String, dynamic> responseJson = json.decode(response.body); print(responseJson); // 取出data字段对应的待选原因列表 List reasonList = responseJson['data'] as List; setState(() { datalist = reasonList; }); return "load success"; } - 给列表变量指定明确类型,替换原来的列表声明语句:
// 原代码:List datalist = List(); List<Map<String, dynamic>> datalist = []; - 优化下拉组件渲染逻辑,增加空判断、处理返回值多余空格问题,避免渲染异常。修改
_dropdownPending的items属性逻辑:items: datalist.map((item) { // 用trim()去掉接口返回reason值前后的多余空格,避免值匹配异常 String reasonVal = item['reason'].toString().trim(); return DropdownMenuItem<String>( child: Text(reasonVal), value: reasonVal, ); }).toList(), - 修正方法返回值类型匹配问题:原
_getPendingRsn声明返回Future<String>,之前错误返回了Map类型的responseJson,修复后返回字符串状态即可,避免隐式类型错误。
注意点:接口返回的部分reason值首尾带有大量多余空格(比如日志中
NO ELECTRICITY WHEN VISITED尾部的空格),如果不做trim处理,后续下拉框选中值匹配、表单提交时很容易出现非预期问题。
内容的提问来源于stack exchange,提问作者Radhika Ahir
相关产品推荐
相关产品推荐

