// Dart imports: import 'dart:convert'; import 'dart:io'; // Package imports: import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; // Project imports: import 'base_model.dart'; // import 'net_header.dart'; // import 'package:light_wave/utils/global_toast.dart'; // import 'package:light_wave/pages/login/login_page.dart'; // import 'package:light_wave/routers/application.dart'; // import 'package:fluttertoast/fluttertoast.dart'; /// 自定义枚举 enum Method { get, post } class Net { // 工厂模式 factory Net() => _getInstance(); static Net get instance => _getInstance(); static Net _instance; Dio dio; Net._internal() { // 初始化 dio = Dio( BaseOptions( connectTimeout: 60000, // 连接服务器超时时间,单位是毫秒. receiveTimeout: 10000, // 响应流上前后两次接受到数据的间隔,单位为毫秒, 这并不是接收数据的总时限. // contentType: ContentType.parse('x-www-form-urlencoded').toString(), // responseType: ResponseType.plain, // responseType: ResponseType.json, ), ); (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { client.badCertificateCallback = (X509Certificate cert, String host, int port) { //TODO return true; }; }; } /// 打印拦截器(便于调试) static final interceptors = InterceptorsWrapper( /// 请求发送前处理处理一些事情 onRequest: (RequestOptions options) { print("--------------------请求参数---------------------"); print(json.encode(options.headers)); print(options.method); print(options.queryParameters); print(options.baseUrl + options.path); print(options.data); print("--------------------请求参数---------------------"); return options; }, /// 在数据响应前做一些预处理 onResponse: (Response response) { // Log.i("--------------------响应结果---------------------"); // Log.e("response.statusCode", "${response.statusCode}"); // Log.e("response.data", "${json.encode(response.data)}"); // Log.e("response.headers", "${response.headers}"); // Log.i("--------------------响应结果---------------------"); return response; }, /// 错误处理 onError: (DioError e) { // Log.e("DioError", "$e"); return e; }, ); // 单列模式 static Net _getInstance() { if (_instance == null) { _instance = Net._internal(); } return _instance; } get(String url, Map params, {Function success, Function failure}) { _doRequest(url, params, Method.get, success, failure); } post(String url, Map params, {Function success, Function failure}) { _doRequest(url, params, Method.post, success, failure); } void _doRequest(String url, Map params, Method method, Function successCallBack, Function failureCallBack) async { try { /// 可以添加header // if (isIntelligent) { // dio.options.headers.addAll(await NetHeader.getZnToken()); // } else { // if (isContentType) { // dio.options.contentType = // ContentType.parse("application/x-www-form-urlencoded").toString(); // } // dio.options.headers.addAll(NetHeader.dmsHeaders); // } dio.interceptors.add(interceptors); Response response; switch (method) { case Method.get: if (params != null && params.isNotEmpty) { response = await dio.get(url, queryParameters: params); } else { response = await dio.get(url); } break; case Method.post: if (params != null && params.isNotEmpty) { response = await dio.post(url, data: params); } else { response = await dio.post(url); } break; } Map result = json.decode(response.toString()); // 打印信息 print('''api: $url\nparams: $params\nresult: $result'''); // 转化为model BaseModel model = BaseModel.fromJson(result); if (model.code == 100 || model.code == 0) { // 100 请求成功 if (successCallBack != null) { //返回请求数据 if (model.result == null) { successCallBack(model.message); } else { successCallBack(model.result); } } } else { //TODO //直接使用Toast弹出错误信息 //返回失败信息 // GlobalToast.globalToast('${model.message}!~'); if (failureCallBack != null) { failureCallBack(model.code); // if (model.code == 1 && model.message == 'token过期') { // Application.navigatorKey.currentState.pushNamedAndRemoveUntil( // "/LoginPage", ModalRoute.withName("/")); // } // failureCallBack(model.message); } } } catch (exception) { print('错误:${exception.toString()}'); // FlutterToast.showToast(msg: "请求失败,请稍后再试"); if (failureCallBack != null) { failureCallBack(exception.toString()); } } } // 上传文件(图片) // doUploadFile(String url, File file, String loadingText,Function successCallBack, // Function failureCallBack) async { // try { // String timeStamp = DateTime.now().millisecondsSinceEpoch.toString(); // FormData formData = FormData.from({ // 'file': UploadFileInfo(file, '$timeStamp.jpg', // contentType: ContentType.parse("image/jpeg")) // }); // Response response = await dio.post(url, data: formData); // print('$response'); // 在需要生成model时需要json格式 // Map result = json.decode(response.toString()); // assert(() { // // assert只会在debug模式下执行,release模式下不会执行 // // 打印信息 // print('''api: $url\nresult: $result'''); // return true; // }()); // BaseModel model = BaseModel.fromJson(result); // if (model.code == 200) { // // 200 请求成功 // if (successCallBack != null) { // if (model.data != null) { // successCallBack(model.data); // } else { // successCallBack({}); // } // } // } else { // //Fluttertoast.showToast(msg: "${model.msg}"); // if (failureCallBack != null) { // failureCallBack(model.msg); // } // } // } catch (exception) { // assert(() { // // 打印信息 // print('''api: $url\n错误:${exception.toString()}'''); // return true; // }()); // // Fluttertoast.showToast(msg: '加载失败'); // if (failureCallBack != null) { // failureCallBack(exception.toString()); // } // } // } }