You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
7.1 KiB

import 'dart:convert';
import 'dart:io';
import 'package:dio/adapter.dart';
import 'package:dio/dio.dart';
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) {
4 years ago
//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<String, dynamic> params,
{Function success, Function failure}) {
_doRequest(url, params, Method.get, success, failure);
}
post(String url, Map<String, dynamic> params,
{Function success, Function failure}) {
_doRequest(url, params, Method.post, success, failure);
}
void _doRequest(String url, Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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());
// }
// }
// }
}