DioUtil.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import 'package:deus_app/common/local/StoreHelper.dart';
  2. import 'package:deus_app/common/utils/ConstantString.dart';
  3. import 'package:deus_app/main.dart';
  4. import 'package:deus_app/page/login/login_page.dart';
  5. import 'package:dio/dio.dart';
  6. import 'package:flutter_easyloading/flutter_easyloading.dart';
  7. import 'package:pretty_dio_logger/pretty_dio_logger.dart';
  8. /// 请求方法
  9. enum DioMethod {
  10. get,
  11. post,
  12. put,
  13. delete,
  14. patch,
  15. head,
  16. }
  17. class DioUtil {
  18. /// 单例模式
  19. static DioUtil? _instance;
  20. factory DioUtil() => _instance ?? DioUtil._internal();
  21. static DioUtil? get instance => _instance ?? DioUtil._internal();
  22. /// 连接超时时间
  23. static const int connectTimeout = 30 * 1000;
  24. /// 响应超时时间
  25. static const int receiveTimeout = 30 * 1000;
  26. /// Dio实例
  27. static Dio _dio = Dio();
  28. /// 初始化
  29. DioUtil._internal() {
  30. // 初始化基本选项
  31. BaseOptions options = BaseOptions(
  32. baseUrl: 'https://fqgz.flowbb.cn:7070/system-api/',
  33. connectTimeout: connectTimeout,
  34. receiveTimeout: receiveTimeout);
  35. _instance = this;
  36. // 初始化dio
  37. _dio = Dio(options);
  38. // 添加拦截器
  39. _dio.interceptors.add(InterceptorsWrapper(
  40. onRequest: _onRequest, onResponse: _onResponse, onError: _onError));
  41. _dio.interceptors.add(PrettyDioLogger(requestHeader: true, requestBody:
  42. true, responseHeader: true));
  43. }
  44. /// 请求拦截器
  45. void _onRequest(RequestOptions options, RequestInterceptorHandler handler) {
  46. // 对非open的接口的请求参数全部增加userId
  47. if (!options.path.contains("open")) {
  48. options.queryParameters["userId"] = "xxx";
  49. }
  50. // 头部添加token
  51. options.headers["Authorization"] = StoreHelper.getStorage(ConstantString.token);
  52. // 更多业务需求
  53. handler.next(options);
  54. // super.onRequest(options, handler);
  55. }
  56. /// 相应拦截器
  57. void _onResponse(
  58. Response response, ResponseInterceptorHandler handler) async {
  59. // 请求成功是对数据做基本处理
  60. if (response.statusCode == 200) {
  61. // ....
  62. handler.next(response);
  63. } else {
  64. // ....
  65. // showToast(response.statusMessage);
  66. }
  67. if (response.requestOptions.baseUrl.contains("???????")) {
  68. // 对某些单独的url返回数据做特殊处理
  69. }
  70. }
  71. /// 错误处理
  72. void _onError(DioError error, ErrorInterceptorHandler handler) {
  73. handler.next(error);
  74. }
  75. /// 请求类
  76. Future<T> request<T>(
  77. String path, {
  78. DioMethod method = DioMethod.get,
  79. Map<String, dynamic>? params,
  80. data,
  81. CancelToken? cancelToken,
  82. Options? options,
  83. ProgressCallback? onSendProgress,
  84. ProgressCallback? onReceiveProgress,
  85. }) async {
  86. const _methodValues = {
  87. DioMethod.get: 'get',
  88. DioMethod.post: 'post',
  89. DioMethod.put: 'put',
  90. DioMethod.delete: 'delete',
  91. DioMethod.patch: 'patch',
  92. DioMethod.head: 'head'
  93. };
  94. EasyLoading.show(status: 'loading...');
  95. options ??= Options(method: _methodValues[method]);
  96. try {
  97. Response response;
  98. response = await _dio.request(path,
  99. data: data,
  100. queryParameters: params,
  101. cancelToken: cancelToken,
  102. options: options,
  103. onSendProgress: onSendProgress,
  104. onReceiveProgress: onReceiveProgress);
  105. EasyLoading.dismiss();
  106. if(response.data['code']==403){
  107. // 跳转登录页面并清空栈
  108. globalNavigatorKey.currentState
  109. ?.pushNamedAndRemoveUntil(LoginPage.routeName, (route) => false);
  110. // showToast('登录超时,请重新登录');
  111. }
  112. return response.data;
  113. } on DioError catch (e) {
  114. EasyLoading.dismiss();
  115. // showToast(e.message);
  116. if(e.response?.data['code']==403){
  117. // 跳转登录页面并清空栈
  118. globalNavigatorKey.currentState
  119. ?.pushNamedAndRemoveUntil(LoginPage.routeName, (route) => false);
  120. // showToast('登录超时,请重新登录');
  121. }
  122. return e.response?.data;
  123. }
  124. }
  125. /// 开启日志打印
  126. /// 需要打印日志的接口在接口请求前 DioUtil.instance?.openLog();
  127. void openLog() {
  128. _dio.interceptors
  129. .add(LogInterceptor(responseHeader: false, responseBody: true));
  130. }
  131. }