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
相关产品推荐
相关产品推荐

