import 'package:dio/dio.dart'; class AppRequest { static const Duration defaultTimeout = Duration(seconds: 15); static final AppRequest instance = AppRequest(); final Dio dio; AppRequest({ Dio? dio, String baseUrl = '', Duration connectTimeout = defaultTimeout, Duration sendTimeout = defaultTimeout, Duration receiveTimeout = defaultTimeout, }) : dio = dio ?? Dio( BaseOptions( baseUrl: baseUrl, connectTimeout: connectTimeout, sendTimeout: sendTimeout, receiveTimeout: receiveTimeout, responseType: ResponseType.json, ), ); void setBaseUrl(String baseUrl) { dio.options.baseUrl = baseUrl; } void setHeader(String key, Object? value) { dio.options.headers[key] = value; } void removeHeader(String key) { dio.options.headers.remove(key); } void setToken(String token, {String prefix = 'Bearer'}) { final value = prefix.isEmpty ? token : '$prefix $token'; setHeader('Authorization', value); } void clearToken() { removeHeader('Authorization'); } Future get( String path, { Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onReceiveProgress, }) { return request( path, method: 'GET', queryParameters: queryParameters, options: options, cancelToken: cancelToken, onReceiveProgress: onReceiveProgress, ); } Future post( String path, { Object? data, Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) { return request( path, method: 'POST', data: data, queryParameters: queryParameters, options: options, cancelToken: cancelToken, onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); } Future put( String path, { Object? data, Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) { return request( path, method: 'PUT', data: data, queryParameters: queryParameters, options: options, cancelToken: cancelToken, onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); } Future delete( String path, { Object? data, Map? queryParameters, Options? options, CancelToken? cancelToken, }) { return request( path, method: 'DELETE', data: data, queryParameters: queryParameters, options: options, cancelToken: cancelToken, ); } Future request( String path, { required String method, Object? data, Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { final response = await dio.request( path, data: data, queryParameters: queryParameters, options: _withMethod(options, method), cancelToken: cancelToken, onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); return response.data; } Options _withMethod(Options? options, String method) { return options == null ? Options(method: method) : options.copyWith(method: method); } }