直接上代碼吧,拿走不謝!
import 'dart:convert';
import 'package:connectivity/connectivity.dart';
import 'package:dio/dio.dart';
import 'package:flutter_application_yiguan/utils/jq_utils.dart';
import 'package:fluttertoast/fluttertoast.dart';
/**
* json在線生成model工具
* https://caijinglong.github.io/json2dart/index_ch.html
* 運行以下命令:
* flutter packages pub run build_runner build
* flutter packages pub run build_runner watch
*/
/// 請求完成回調(diào)方法
typedef CompleteCallback = void Function(DioError? error, dynamic result);
const String kNoConnectivityCode = '3001';
/// brief: 請求方式 枚舉值
/// 注意:Dart語言的枚舉不支持指定原始值
enum JQHttpType { get, post }
class JQBaseHttpRequest {
/// JQHttpType type 請求方式
/// String url 請求地址
/// Map<String, String> httpHeader
/// Map params 請求參數(shù)
/// CompleteCallback completeCallback 請求完成回調(diào)
static httpRequest({
required String url,
required JQHttpType type,
Map<String, dynamic>? httpHeader,
Map<String, dynamic>? params,
CompleteCallback? completeCallback,
}) async {
JQUtils.printf('url-->$url');
JQUtils.printf('params-->$params');
/// 設(shè)置 Options
Options option = Options();
/// 請求方式
option.method = (type != JQHttpType.post) ? 'GET' : 'POST';
/// 設(shè)置 headers
Map<String, dynamic> headers = new Map();
if (httpHeader != null) {
headers.addAll(httpHeader);
}
option.headers = headers;
JQUtils.printf('option.headers---------->${option.headers}');
/// 超時時間 15000毫秒ms(15秒)
/// 發(fā)送超時
option.sendTimeout = 15000;
/// 接收超時
option.receiveTimeout = 15000;
var connectivityResult = await (new Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.none) {
/// 沒有網(wǎng)絡(luò)
RequestOptions requestOptions = RequestOptions(path: url);
Response response = Response(
data: {'status': kNoConnectivityCode, 'message': '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'},
requestOptions: requestOptions,
statusCode: 3001,
statusMessage: '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常',
);
DioError error = DioError(
response: response,
requestOptions: RequestOptions(path: url),
type: DioErrorType.other,
error: Error.safeToString('當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'),
);
completeCallback!(error, null);
/// 實際上返回的是response的data數(shù)據(jù)
return response.data;
} else {
/// 有網(wǎng)絡(luò)
Dio dio = new Dio();
try {
Response response = await dio.request(url,
// data: params,
queryParameters: params,
options: option);
JQUtils.printf('網(wǎng)絡(luò)請求成功');
JQUtils.printf('-----------response----------');
/// 打印headers
JQUtils.printf('response.headers ------>');
JQUtils.printf(response.headers);
/// response是一個JSON對象
JQUtils.printf('-----------data----------');
/// 打印data
JQUtils.printf('response.data ------>');
JQUtils.printf('json格式 == ' + json.encode(response.data));
if (completeCallback != null) {
completeCallback(null, response.data);
}
/// 實際上返回的是response的data數(shù)據(jù)
return response.data;
} on DioError catch (e) {
/// 請求異常處理
/// 延時0.3秒執(zhí)行返回,處理和loading的重合
Future.delayed(Duration(milliseconds: 300), () {
/// error存在,底層封裝統(tǒng)一顯示提示
Fluttertoast.showToast(
msg: "網(wǎng)絡(luò)請求異常",
gravity: ToastGravity.CENTER,
);
JQUtils.printf('延時0.3s執(zhí)行');
});
JQUtils.printf('網(wǎng)絡(luò)請求異常======');
JQUtils.printf(e);
JQUtils.printf('e.response====');
JQUtils.printf(e.response);
JQUtils.printf('e.response.data');
JQUtils.printf(e.response?.data);
if (completeCallback != null) {
completeCallback(e, null);
}
/// 實際上返回的是response的data數(shù)據(jù)
return e.response?.data;
}
}
}
/// 文件下載
static httpDownload({
required String url,
required String localSavePath,
required JQHttpType type,
Map<String, dynamic>? httpHeader,
Map<String, dynamic>? params,
CancelToken? cancelToken,
ProgressCallback? progressCallback,
CompleteCallback? completeCallback,
}) async {
JQUtils.printf('url-->$url');
JQUtils.printf('params-->$params');
/// 設(shè)置 Options
Options option = Options();
/// 請求方式
option.method = (type != JQHttpType.post) ? 'GET' : 'POST';
/// 設(shè)置 headers
Map<String, dynamic> headers = new Map();
if (httpHeader != null) {
headers.addAll(httpHeader);
}
option.headers = headers;
JQUtils.printf('option.headers---------->${option.headers}');
JQUtils.printf('params---------->${params}');
/// 超時時間 15000毫秒ms(15秒)
/// 發(fā)送超時
option.sendTimeout = 15000;
/// 接收超時
option.receiveTimeout = 15000;
var connectivityResult = await (new Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.none) {
/// 沒有網(wǎng)絡(luò)
RequestOptions requestOptions = RequestOptions(path: url);
Response response = Response(
data: {'status': kNoConnectivityCode, 'message': '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'},
requestOptions: requestOptions,
statusCode: 3001,
statusMessage: '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常',
);
DioError error = DioError(
response: response,
requestOptions: RequestOptions(path: url),
type: DioErrorType.other,
error: Error.safeToString('當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'),
);
completeCallback!(error, null);
/// 實際上返回的是response的data數(shù)據(jù)
return response;
} else {
/// 有網(wǎng)絡(luò)
Dio dio = new Dio();
try {
Response response = await dio.download(url, localSavePath,
queryParameters: params,
options: option,
onReceiveProgress: progressCallback == null
? null
: (int count, int total) {
if (total == -1) {
/// 不知道進度的默認(rèn)50%
total = count * 2;
}
progressCallback(count, total);
},
cancelToken: cancelToken);
response.extra = <String, dynamic>{"localPath": localSavePath};
JQUtils.printf('網(wǎng)絡(luò)請求成功');
JQUtils.printf('-----------response----------');
/// 打印headers
JQUtils.printf('response.headers ------>');
JQUtils.printf(response.headers);
/// response是一個JSON對象
JQUtils.printf('-----------data----------');
/// 打印data
JQUtils.printf('response.data ------>');
JQUtils.printf(response.data);
JQUtils.printf('localSavePath = ' + localSavePath);
if (completeCallback != null) {
// 下載文件這里,把文件的本地存儲地址返回
completeCallback(null, localSavePath);
}
/// 實際上返回的是response的data數(shù)據(jù)
return response;
} on DioError catch (e) {
/// 請求異常處理
/// 延時0.3秒執(zhí)行返回,處理和loading的重合
Future.delayed(Duration(milliseconds: 300), () {
/// error存在,底層封裝統(tǒng)一顯示提示
Fluttertoast.showToast(
msg: "網(wǎng)絡(luò)請求異常",
gravity: ToastGravity.CENTER,
);
JQUtils.printf('延時0.3s執(zhí)行');
});
JQUtils.printf('網(wǎng)絡(luò)請求異常');
JQUtils.printf(e);
JQUtils.printf(e.response);
if (completeCallback != null) {
completeCallback(e, null);
}
/// 實際上返回的是response的data數(shù)據(jù)
return e.response;
}
}
}
}