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

Flutter请求报错:_InternalLinkedHashMap无法转为List类型求助

问题解决:type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List'

错误根源

服务器返回的是单个详情对象(Map类型),但getAllDetails方法强行将返回数据转为List并解析成List<DetailsModel>,类型不匹配导致报错。同时你的DetailsModel.fromJson是为解析单个Map设计的,与当前List解析逻辑冲突。

解决方案

根据实际场景选择以下两种方案:

方案1:修改为返回单个详情对象(推荐)

既然接口返回单个对象,直接调整数据源方法的返回类型和解析逻辑,更符合语义:

  1. 修改数据源接口(假设原接口定义):
abstract class DetailsRemoteDataSource {
  // 方法名改为更准确的getDetails,返回单个DetailsModel
  Future<DetailsModel> getDetails();
}
  1. 修改实现类:
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();
    }
  }
}
  1. 修改展示代码:
// 不再需要[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:05:38