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

Flutter中_InternalLinkedHashMap与Map<String,dynamic>类型不匹配问题求助

问题分析与修复方案

错误原因

报错type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'的核心原因:data['params']的实际类型是未指定泛型的Map<dynamic, dynamic>(底层实现为_InternalLinkedHashMap),Dart的强类型检查不允许将其隐式转换为Map<String, dynamic>,因此触发类型不匹配错误。

修复方案

方案1:在API Wrapper中安全转换类型

修改报错行,通过类型校验+转换的方式,将data['params']转为Map<String, dynamic>,同时处理空值情况,避免崩溃:

Map<String, dynamic> params = {};
// 先校验类型再转换,避免类型转换异常
if (data['params'] != null && data['params'] is Map) {
  // 方式1:构造新的指定泛型的Map,兼容性更强
  params = Map<String, dynamic>.from(data['params']);
  // 方式2:用cast转换泛型,效率更高(需确保所有键都是String类型)
  // params = (data['params'] as Map).cast<String, dynamic>();
}

也可以用更简洁的空安全写法:

Map<String, dynamic> params = (data['params'] as Map?)?.cast<String, dynamic>() ?? {};

方案2:从源头规范参数类型

Repository中的fetchResponse方法未指定query的类型,导致传入的query可能是Map<dynamic, dynamic>。给query明确指定类型,从上游避免类型不匹配:

// 给query参数指定Map<String, dynamic>类型
Future<LeaveListModel> fetchResponse(Map<String, dynamic> query) async {
  final response = await _wrapper.apiRequest(
      "get", _wrapper.leaveListGetData, {'params': query}, true);
  return LeaveListModel.fromJson(response);
}

额外优化:简化GET参数拼接

原代码手动拼接URL参数容易出现特殊字符编码问题,建议直接使用Dio自带的queryParameters参数,无需手动拼接:

if (method == "get") {
  try {
    Dio dio = Dio();
    dio.options.headers = headers;
    // 直接传入queryParameters,Dio自动处理编码和拼接
    final response = await dio.get(url, queryParameters: params);
    responseJson = _response(response);
  } on SocketException {
    throw FetchDataException('Tidak terhubung ke server');
  }
  // ...
}

内容的提问来源于stack exchange,提问作者1988

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:01:27