MyDio.dart 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'package:bbyyy/beans/simple_bean.dart';
  4. import 'package:bbyyy/my_tools/easy_loading/easy_loading.dart';
  5. import 'package:bbyyy/my_tools/event_bus.dart';
  6. import 'package:bbyyy/my_tools/global.dart';
  7. import 'package:bbyyy/my_tools/my_apis.dart';
  8. import 'package:bbyyy/my_tools/my_cookie.dart';
  9. import 'package:bbyyy/my_tools/my_tools.dart';
  10. import 'package:bbyyy/my_tools/s.dart';
  11. import 'package:bbyyy/paegs/root_page/root_page_view.dart';
  12. import 'package:dio/dio.dart';
  13. import 'package:flutter/cupertino.dart';
  14. import 'package:flutter/material.dart';
  15. import 'package:simple_logger/simple_logger.dart';
  16. ///http请求成功回调
  17. typedef SCallBack<T> = void Function(Response response, bool hasError);
  18. ///失败回调
  19. typedef FCallBack = void Function(DioError error);
  20. final logger = SimpleLogger();
  21. class MyDio {
  22. //私有构造函数
  23. MyDio._internal() {
  24. initDio();
  25. }
  26. //保存单例
  27. static MyDio _singleton = MyDio._internal();
  28. //工厂构造函数
  29. factory MyDio() => _singleton;
  30. Dio dio; // 使用默认配置
  31. BaseOptions options;
  32. initDio() {
  33. // 或者通过传递一个 `options`来创建dio实例
  34. options = BaseOptions(
  35. baseUrl: MyCookie().getServer(),
  36. connectTimeout: 15000,
  37. receiveTimeout: 5000,
  38. );
  39. if (MyCookie().loginInformation != null) {
  40. options.headers = {
  41. '${MyApis.getApi('token')}': MyCookie().getToken(),
  42. '${MyApis.getApi('user')}': MyCookie().getUser(),
  43. 'Content-Type': 'application/json'
  44. };
  45. }
  46. dio = Dio(options);
  47. }
  48. cancelRequest(){
  49. dio.clear();
  50. }
  51. post(String url, data, SCallBack sCallBack, FCallBack fCallBack) async {
  52. logger.info(MyCookie().getServer() + url);
  53. try {
  54. logger.info(json.encode(data));
  55. } catch (e) {}
  56. try {
  57. Response re = await dio.post(url, data: data);
  58. print(dio.options.headers);
  59. logger.info(MyCookie().getServer() + url);
  60. try {
  61. logger.info(json.encode(data));
  62. } catch (e) {}
  63. logger.info(re.data);
  64. if (await checkingReturnParameter(re.data)) {
  65. sCallBack(re, false);
  66. // EasyLoading.dismiss();
  67. } else {
  68. sCallBack(re, true);
  69. }
  70. } on DioError catch (e) {
  71. switch (e.type) {
  72. case DioErrorType.cancel:
  73. fCallBack(e);
  74. EasyLoading.showToast('请求已取消');
  75. break;
  76. case DioErrorType.connectTimeout:
  77. fCallBack(e);
  78. EasyLoading.showToast('链接超时');
  79. if(!MyCookie().switching){
  80. changeServer();
  81. }
  82. break;
  83. case DioErrorType.other:
  84. fCallBack(e);
  85. EasyLoading.showToast('网络错误');
  86. if(!MyCookie().switching){
  87. changeServer();
  88. }
  89. break;
  90. case DioErrorType.receiveTimeout:
  91. fCallBack(e);
  92. EasyLoading.showToast('接受超时');
  93. break;
  94. case DioErrorType.response:
  95. fCallBack(e);
  96. EasyLoading.showToast('服务器异常');
  97. if(!MyCookie().switching){
  98. changeServer();
  99. }
  100. break;
  101. case DioErrorType.sendTimeout:
  102. fCallBack(e);
  103. EasyLoading.showToast('网络不佳');
  104. break;
  105. default:
  106. fCallBack(e);
  107. EasyLoading.showToast('网络出错');
  108. if(!MyCookie().switching){
  109. changeServer();
  110. }
  111. }
  112. }
  113. }
  114. get(String url, SCallBack sCallBack, FCallBack fCallBack) async {
  115. try {
  116. Response re = await dio.get(url);
  117. logger.info(MyCookie().getServer() + url);
  118. logger.info(re.data);
  119. if (await checkingReturnParameter(re.data)) {
  120. sCallBack(re, false);
  121. // EasyLoading.dismiss();
  122. } else {
  123. sCallBack(re, true);
  124. }
  125. } on DioError catch (e) {
  126. switch (e.type) {
  127. case DioErrorType.cancel:
  128. fCallBack(e);
  129. EasyLoading.showToast('请求已取消');
  130. break;
  131. case DioErrorType.connectTimeout:
  132. fCallBack(e);
  133. EasyLoading.showToast('您的网络不稳定,请稍后重试');
  134. break;
  135. case DioErrorType.other:
  136. fCallBack(e);
  137. EasyLoading.showToast('您的网络不稳定,请稍后重试');
  138. break;
  139. case DioErrorType.receiveTimeout:
  140. fCallBack(e);
  141. EasyLoading.showToast('您的网络不稳定,请稍后重试');
  142. break;
  143. case DioErrorType.response:
  144. fCallBack(e);
  145. EasyLoading.showToast('您的网络不稳定,请稍后重试');
  146. break;
  147. case DioErrorType.sendTimeout:
  148. fCallBack(e);
  149. EasyLoading.showToast('您的网络不稳定,请稍后重试');
  150. break;
  151. default:
  152. fCallBack(e);
  153. EasyLoading.showToast('您的网络不稳定,请稍后重试');
  154. }
  155. }
  156. }
  157. query(data, SCallBack sCallBack, FCallBack fCallBack) {
  158. post(MyApis.getApi('query'), data, sCallBack, fCallBack);
  159. }
  160. save(data, SCallBack sCallBack, FCallBack fCallBack) {
  161. post(MyApis.getApi('save'), data, sCallBack, fCallBack);
  162. }
  163. del(data, SCallBack sCallBack, FCallBack fCallBack) {
  164. post(MyApis.getApi('delete'), data, sCallBack, fCallBack);
  165. }
  166. update(data, SCallBack sCallBack, FCallBack fCallBack) {
  167. post(MyApis.getApi('update'), data, sCallBack, fCallBack);
  168. }
  169. updateM(data, SCallBack sCallBack, FCallBack fCallBack) {
  170. post(MyApis.getApi('updateM'), data, sCallBack, fCallBack);
  171. }
  172. loginUpload(File _image, String user, String token, SCallBack sCallBack,
  173. FCallBack fCallBack, BuildContext context) async {
  174. var s = '${MyApis.getApi('upload')}?token=$token&user=$user';
  175. logger.info(MyCookie().getServer() + s);
  176. var name = _image.path
  177. .substring(_image.path.lastIndexOf("/") + 1, _image.path.length);
  178. print(name);
  179. FormData formData = new FormData.fromMap({
  180. '${MyApis.getApi('files')}': await MultipartFile.fromFile(
  181. _image.path,
  182. filename: name,
  183. ),
  184. });
  185. post(s, formData, sCallBack, fCallBack);
  186. }
  187. upload(File _image, SCallBack sCallBack, FCallBack fCallBack,
  188. BuildContext context) async {
  189. var s = '${MyApis.getApi('upload')}?${MyCookie().getUT()}';
  190. logger.info(MyCookie().getServer() + s);
  191. var name = _image.path
  192. .substring(_image.path.lastIndexOf("/") + 1, _image.path.length);
  193. print(name);
  194. FormData formData = new FormData.fromMap({
  195. '${MyApis.getApi('files')}': await MultipartFile.fromFile(
  196. _image.path,
  197. filename: name,
  198. ),
  199. });
  200. post(s, formData, sCallBack, fCallBack);
  201. }
  202. loginUpdate(data, String user, String token, SCallBack sCallBack,
  203. FCallBack fCallBack, BuildContext context) {
  204. String s = '/rdm/update?token=$token&user=$user';
  205. logger.info(MyCookie().getServer() + s);
  206. post(s, data, sCallBack, fCallBack);
  207. }
  208. Future<bool> checkingReturnParameter(data) async {
  209. SimpleBean simpleBean;
  210. try {
  211. simpleBean = SimpleBean.fromJson(json.decode(data));
  212. } catch (e) {
  213. print(e);
  214. }
  215. if (simpleBean != null) {
  216. if (simpleBean.error == null || simpleBean.error.length == 0) {
  217. return true;
  218. } else {
  219. EasyLoading.showToast(simpleBean.error);
  220. if (simpleBean.error.contains('token') ||
  221. simpleBean.error.contains('会话过期,请重新登录') ||
  222. simpleBean.error.contains('登录失效,请重新登录')) {
  223. MyCookie().clean();
  224. cancelRequest();
  225. RootPageView().bNIndex = 0;
  226. navigatorKey.currentState.pushNamedAndRemoveUntil(
  227. '/loginPage', ModalRoute.withName("/loginPage"));
  228. }
  229. return false;
  230. }
  231. } else {
  232. return false;
  233. }
  234. }
  235. void changeServer() {
  236. MyCookie().switching = true;
  237. List<String> salt = MyCookie().getLoginInformation().data.extra.salt;
  238. print('salt.length=======${salt.toString()}');
  239. if(salt==null||salt.length==0){
  240. MyCookie().prefs.setString('using', '');
  241. }else{
  242. w:
  243. for (int i = 0; i < salt.length; i++) {
  244. if (MyCookie().prefs.getString('using') == null ||
  245. MyCookie().prefs.getString('using').isEmpty ||
  246. MyCookie().prefs.getString('using') == '') {
  247. MyCookie().prefs.setString('using', salt[i]);
  248. break w;
  249. } else if (!MyCookie().prefs.getString('using').contains(salt[i])) {
  250. MyCookie().prefs.setString(
  251. 'using', '${MyCookie().prefs.getString('using')},${salt[i]}');
  252. break w;
  253. }
  254. if (i == salt.length - 1 &&
  255. MyCookie().prefs.getString('using').contains(salt[i])) {
  256. MyCookie().prefs.setString('using', '');
  257. }
  258. }
  259. }
  260. if(MyCookie().prefs.getString('using')==''){
  261. MyCookie().prefs.setString('timestamp', '');
  262. MyCookie().prefs.setString('uid', '');
  263. MyCookie().prefs.setString('serverID', '');
  264. EventBus().emit('服务器异常,请稍后再试');
  265. MyCookie().switching = false;
  266. }else{
  267. MyCookie().prefs.setString(
  268. 'timestamp', MyCookie().getLoginInformation().data.extra.timestamp);
  269. MyCookie().prefs.setString(
  270. 'uid', MyCookie().getLoginInformation().data.extra.uid.toString());
  271. s().encryption();
  272. RootPageView().bNIndex = 0;
  273. cancelRequest();
  274. MyCookie().reNum++;
  275. MyCookie().switching = false;
  276. navigatorKey.currentState.pushNamedAndRemoveUntil(
  277. '/loginPage', ModalRoute.withName("/loginPage"));
  278. }
  279. }
  280. }