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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:15:09