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

Dart项目调用dioClient.post缺少queryParameters必填参数问题求助

问题:调用自定义DioClient的post方法时提示必填参数queryParameters缺失

错误信息

The named parameter 'queryParameters' is required, but there's no corresponding argument.
Try adding the required argument

问题代码片段

Future<ApiResponse> forgetPassword(String identity) async {
    try {
      log(identity);
      Response response = await dioClient.post(AppConstants.FORGET_PASSWORD_URI, 
     data: {"identity": identity}

完整AuthRepo代码

import 'dart:developer';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:eamar_seller_app/data/datasource/remote/dio/dio_client.dart';
import 'package:eamar_seller_app/data/datasource/remote/exception/api_error_handler.dart';
import 'package:eamar_seller_app/data/model/response/base/api_response.dart';
import 'package:eamar_seller_app/utill/app_constants.dart';

class AuthRepo {
 late final DioClient dioClient;
 late final SharedPreferences sharedPreferences;
  AuthRepo({required this.dioClient, required this.sharedPreferences});

  Future<ApiResponse> login({String? emailAddress, String? password}) async {
    try {
      Response response = await dioClient.post(
        AppConstants.LOGIN_URI, data:
         {"email": emailAddress, "password": password},
      );
      return ApiResponse.withSuccess(response);
    } catch (e) {
     return ApiResponse.withError(ApiErrorHandler.getMessage(e));
    }
  }


  Future<ApiResponse> forgetPassword(String identity) async {
    try {
      log(identity);
      Response response = await dioClient.post(AppConstants.FORGET_PASSWORD_URI, 
     data: {"identity": identity}
      
      );
      log(response.toString());
      return ApiResponse.withSuccess(response);
    } catch (e) {
      log(e.toString());
      return ApiResponse.withError(ApiErrorHandler.getMessage(e));
    }
  }

  Future<ApiResponse> resetPassword(String identity, String otp ,String password, String confirmPassword) async {
    try {
      Response response = await dioClient.post(
          AppConstants.RESET_PASSWORD_URI, data: {"_method" : "put",
        "identity": identity.trim(), "otp": otp,
        "password": password, "confirm_password":confirmPassword});
      return ApiResponse.withSuccess(response);
    } catch (e) {
      return ApiResponse.withError(ApiErrorHandler.getMessage(e));
    }
  }

  Future<ApiResponse> verifyOtp(String identity, String otp) async {
    try {
      Response response = await dioClient.post(
          AppConstants.VERIFY_OTP_URI, data: {"identity": identity.trim(), "otp": otp});
      return ApiResponse.withSuccess(response);
    } catch (e) {
      return ApiResponse.withError(ApiErrorHandler.getMessage(e));
    }
  }


  Future<ApiResponse> updateToken() async {
    try {
      String _deviceToken = await _getDeviceToken();
      FirebaseMessaging.instance.subscribeToTopic(AppConstants.TOPIC);
      Response response = await dioClient.post(
        AppConstants.TOKEN_URI,
        data: {"_method": "put", "cm_firebase_token": _deviceToken},
      );
      return ApiResponse.withSuccess(response);
    } catch (e) {
      return ApiResponse.withError(ApiErrorHandler.getMessage(e));
    }
  }

  Future<String> _getDeviceToken() async {
    String _deviceToken;
    if(Platform.isIOS) {
      _deviceToken = (await FirebaseMessaging.instance.getAPNSToken())!;
    }else {
      _deviceToken = (await FirebaseMessaging.instance.getToken())!;
    }

    print('--------Device Token---------- '+_deviceToken);
    return _deviceToken;
  }

  // for  user token
  Future<void> saveUserToken(String token) async {
    dioClient.token = token;
    dioClient.dio.options.headers = {'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer $token'};

    try {
      await sharedPreferences.setString(AppConstants.TOKEN, token);
    } catch (e) {
      throw e;
    }
  }

  String getUserToken() {
    return sharedPreferences.getString(AppConstants.TOKEN) ?? "";
  }

  bool isLoggedIn() {
    return sharedPreferences.containsKey(AppConstants.TOKEN);
  }

  Future<bool> clearSharedData() async {
    await FirebaseMessaging.instance.unsubscribeFromTopic(AppConstants.TOPIC);
    return sharedPreferences.remove(AppConstants.TOKEN);
    //return sharedPreferences.clear();
  }

  // for  Remember Email
  Future<void> saveUserNumberAndPassword(String number, String password) async {
    try {
      await sharedPreferences.setString(AppConstants.USER_PASSWORD, password);
      await sharedPreferences.setString(AppConstants.USER_EMAIL, number);
    } catch (e) {
      throw e;
    }
  }

  String getUserEmail() {
    return sharedPreferences.getString(AppConstants.USER_EMAIL) ?? "";
  }

  String getUserPassword() {
    return sharedPreferences.getString(AppConstants.USER_PASSWORD) ?? "";
  }

  Future<bool> clearUserNumberAndPassword() async {
    await sharedPreferences.remove(AppConstants.USER_PASSWORD);
    return await sharedPreferences.remove(AppConstants.USER_EMAIL);
  }

}

解决方案

这个错误说明你自定义的DioClient的post方法将queryParameters声明为了必填命名参数,调用时未传入导致报错,有两种解决方式:

方式1:调用时补充queryParameters参数

如果接口不需要查询参数,传入空Map即可满足必填要求;如果需要,传入对应键值对:

Response response = await dioClient.post(
  AppConstants.FORGET_PASSWORD_URI, 
  data: {"identity": identity},
  queryParameters: {} // 传入空Map
);

方式2:修改DioClient的post方法定义

如果queryParameters不是所有请求都必需,将其改为可选参数并设置默认值:

// 示例:修改DioClient中的post方法
Future<Response> post(String uri, {
  required dynamic data,
  Map<String, dynamic>? queryParameters = const {}, // 设置为可选并给默认空Map
  // 其他原有参数...
}) async {
  // 方法原有实现...
}

另外注意你提供的问题代码片段存在语法错误(缺少闭合的)和}),修复后才能正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:52:17