Dart使用dio时`Map<dynamic, dynamic>`无法赋值给`Map<String, dynamic>`参数问题
错误原因
Dio的get方法要求queryParameters参数必须为Map<String, dynamic>类型,你当前代码中payload的声明类型为无泛型约束的Map,Dart会默认推导为Map<dynamic, dynamic>,两者类型不匹配因此触发编译报错。
解决方案
方案1:修改payload泛型约束(推荐)
直接从类属性定义层面规范类型,从根源避免类型不匹配问题,修改代码如下:
class ApiRepository { final String url; // 把无泛型的Map改为明确的Map<String, dynamic> final Map<String, dynamic> payload; // 构造函数参数同步调整类型 ApiRepository(this.url, this.payload); final Dio _dio = Dio(); void get({ required Function() beforeSend, required Function(dynamic data) onSuccess, required Function(dynamic error) onError, }) { // 补充执行你定义的beforeSend逻辑(原代码定义了该参数但未调用) beforeSend(); _dio.get(this.url, queryParameters: this.payload).then((response) { // required修饰的参数不可能为空,可删除多余的非空判断 onSuccess(response.data); }).catchError((error) { onError(error); }); } }
这个方案能在编译阶段就校验传入payload的key必须是字符串,避免运行时类型错误。
方案2:传参时显式转换类型
如果你因为业务逻辑需要,payload必须保留Map<dynamic, dynamic>的类型定义,可以在传入queryParameters时做显式类型转换,只需要修改dio调用行即可:
_dio.get(this.url, queryParameters: Map<String, dynamic>.from(this.payload)).then((response) {
注意该方案如果运行时payload里存在非字符串类型的key,会抛出转换异常。
内容的提问来源于stack exchange,提问作者Das
相关产品推荐
相关产品推荐

