Flutter请求报错:_InternalLinkedHashMap无法转为List类型求助
问题解决:type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List'
错误根源
服务器返回的是单个详情对象(Map类型),但getAllDetails方法强行将返回数据转为List并解析成List<DetailsModel>,类型不匹配导致报错。同时你的DetailsModel.fromJson是为解析单个Map设计的,与当前List解析逻辑冲突。
解决方案
根据实际场景选择以下两种方案:
方案1:修改为返回单个详情对象(推荐)
既然接口返回单个对象,直接调整数据源方法的返回类型和解析逻辑,更符合语义:
- 修改数据源接口(假设原接口定义):
abstract class DetailsRemoteDataSource { // 方法名改为更准确的getDetails,返回单个DetailsModel Future<DetailsModel> getDetails(); }
- 修改实现类:
class DetailsRemoteDataSorceImpl implements DetailsRemoteDataSource { final http.Client client; // 修复原代码空格问题:Clientclient → Client client DetailsRemoteDataSorceImpl({required this.client}); @override Future<DetailsModel> getDetails() async { final response = await http.get( Uri.parse(ConfigUrl.details), headers: {'Content-Type': 'application/json'} ); if(response.statusCode == 200) { // 直接将解析结果转为Map,用fromJson解析单个对象 final details = json.decode(response.body) as Map<String, dynamic>; return DetailsModel.fromJson(details); } else { throw ServerException(); } } }
- 修改展示代码:
// 不再需要[0],直接访问对象属性 Text(details.title,)
方案2:保持返回List(兼容上层逻辑)
如果上层代码依赖List<DetailsModel>的返回类型,可将单个对象包装成List返回:
修改实现类的解析部分:
if(response.statusCode == 200) { final details = json.decode(response.body) as Map<String, dynamic>; // 将单个对象包装成List返回 return [DetailsModel.fromJson(details)]; }
这种情况下,原来的details[0].title展示代码可继续使用。
额外修复
原代码中final http.Clientclient;存在语法错误,需添加空格改为final http.Client client;。
内容的提问来源于stack exchange,提问作者Daniil
相关产品推荐
相关产品推荐

