Flutter类型转换异常:_InternalLinkedHashMap无法转为List的解决求助
Flutter JSON API加载异常解决方案:_InternalLinkedHashMap转List失败
异常核心原因
你遇到的错误本质是:API返回的JSON根结构是对象(对应Dart的_InternalLinkedHashMap<String, dynamic>),但代码里强行将其转换为List<dynamic>。即使更换API,只要新API的根结构仍是对象,就会触发相同异常。
解决步骤
1. 确认API返回的JSON结构
先通过控制台打印解析后的原始数据,明确JSON结构:
在json.decode(content)后添加打印代码:
final dynamic decodedData = json.decode(content); print(decodedData); // 查看控制台输出的JSON结构
常见的两种API返回结构:
- 根为数组(List):
[{"gbeli":{"title":"示例标题"}}, ...] - 根为对象,内部包含数组:
{"data": [{"gbeli":{"title":"示例标题"}}, ...]}
2. 修改数据解析逻辑
根据实际JSON结构调整代码:
情况1:API根结构是对象,内部包含数组
假设数组字段名为data,修改_fetchDataAkhbarGbeli方法:
Future<void> _fetchDataAkhbarGbeli() async { const apiUrl = '你的API地址'; HttpClient client = HttpClient(); client.autoUncompress = true; try { final HttpClientRequest request = await client.getUrl(Uri.parse(apiUrl)); request.headers.set(HttpHeaders.contentTypeHeader, "application/json; charset=UTF-8"); final HttpClientResponse response = await request.close(); final String content = await response.transform(utf8.decoder).join(); final dynamic decodedData = json.decode(content); setState(() { // 替换为API实际的数组字段名(如data、items等) _loadedAkhbarGbeli = decodedData['data'] as List; }); } catch (e) { print('数据加载失败: $e'); // 可在此添加用户友好的错误提示,比如显示错误页面 } }
情况2:API根结构是数组
若确认返回根为数组,可保留类型转换,但建议先判断类型避免崩溃:
Future<void> _fetchDataAkhbarGbeli() async { // ... 其他代码不变 final dynamic decodedData = json.decode(content); setState(() { _loadedAkhbarGbeli = decodedData is List ? decodedData : []; }); }
3. 验证ListView数据访问逻辑
确保_loadedAkhbarGbeli的元素结构与API返回一致,比如API返回的每个数组元素确实包含gbeli->title层级,若结构不同需对应调整Text的参数:
// 示例:若结构是_loadedAkhbarGbeli[index]['title'],则修改为 Text(_loadedAkhbarGbeli[index]["title"])
内容的提问来源于stack exchange,提问作者mohamed yassine
相关产品推荐
相关产品推荐

