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

