flutter dio網路請求共用包
阿新 • • 發佈:2020-12-24
/** * create by wanghao * 2019/8/7 18:47 **/ import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flustars/flustars.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'dart:convert' as convert; class HttpGo { static final String GET = "get"; static final String POST = "post"; static final String DATA = "data"; static final String CODE = "code"; static final String MSG = "msg"; Dio dio; static HttpGo _instance; static HttpGo getInstance() { if (_instance == null) { _instance = HttpGo(); } return _instance; } HttpGo() { dio = Dio(Options( /*baseUrl: "http://192.168.5.6:8085",*/ headers: { 'content-type': 'application/json',// 'Authorization': SpUtil.getString("token")},//沒有的話請註釋掉 connectTimeout: 5000, receiveTimeout: 100000, responseType: ResponseType.JSON, )); } //get請求 get(String url, Function successCallBack, {params, Function errorCallBack}) async { _requstHttp(url, successCallBack, GET, params, errorCallBack); } //post請求 post(String url, Function successCallBack, FormData formData, Function errorCallBack) async { _requstHttp(url, successCallBack, POST, formData, errorCallBack); } //post請求 post1(String url, Function successCallBack, Map<String,dynamic> formData, Function errorCallBack) async { _requstHttp1(url, successCallBack, POST, formData, errorCallBack); } _requstHttp(String url, Function successCallBack, [String method, FormData params, Function errorCallBack]) async { String errorMsg = ''; int code; try { Response response; _addStartHttpInterceptor(dio); //新增請求之前的攔截器 if (method == GET) { if (params != null && params.isNotEmpty) { response = await dio.get(url, data: params); } else { response = await dio.get(url); } } else if (method == POST) { if (params != null && params.isNotEmpty) { response = await dio.post(url, data: params); } else { response = await dio.post(url); } } code = response.statusCode; if (code != 200) { errorMsg = '錯誤碼:' + code.toString() + ',' + response.data.toString(); _error(errorCallBack, errorMsg); return; } String dataStr = json.encode(response.data); Map<String, dynamic> dataMap = json.decode(dataStr); if (dataMap != null && dataMap[CODE] != 0) { errorMsg = '錯誤碼:' + dataMap[CODE].toString() + ',' + dataMap[MSG].toString(); _error(errorCallBack, errorMsg); return; } if (successCallBack != null) { successCallBack(dataMap[DATA]); } } catch (exception) { _error(errorCallBack, exception.toString()); } } _requstHttp1(String url, Function successCallBack, [String method, Map<String,dynamic> params, Function errorCallBack]) async { String errorMsg = ''; int code; try { Response response; _addStartHttpInterceptor(dio); //新增請求之前的攔截器 if (method == GET) { if (params != null && params.isNotEmpty) { response = await dio.get(url, data: params); } else { response = await dio.get(url); } } else if (method == POST) { if (params != null && params.isNotEmpty) { response = await dio.post(url, data: params); } else { response = await dio.post(url); } } code = response.statusCode; if (code != 200) { errorMsg = '錯誤碼:' + code.toString() + ',' + response.data.toString(); _error(errorCallBack, errorMsg); return; } String dataStr = json.encode(response.data); print("here is result" + dataStr); Map<String, dynamic> dataMap = json.decode(dataStr); if (dataMap != null && dataMap[CODE] != 0) { if(dataMap[CODE] != 11) { errorMsg = '錯誤碼:' + dataMap[CODE].toString() + ',' + dataMap[MSG].toString(); } else { errorMsg = dataMap[MSG].toString(); } _error(errorCallBack, errorMsg); return; } if (successCallBack != null) { successCallBack(dataMap[DATA]); } } catch (exception) { _error(errorCallBack, exception.toString()); } } _error(Function errorCallBack, String error) { Fluttertoast.showToast( msg: error.toString(), toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER); if (errorCallBack != null) { errorCallBack(error); } } _addStartHttpInterceptor(Dio dio) { dio.interceptor.request.onSend = (Options options) { // 在請求被髮送之前做一些事情 比如加密的一些操作 或者新增token等引數 對head 或者請求引數進行加工處理 Map<String, dynamic> headers = options.headers; Map<String, dynamic> body = options.data; /*request['token'] = '1111111111'; headers['addParam'] = 'aaaaaaaaaaaaaaa';*/ return options; }; } }
使用方法:
HttpGo.getInstance().post1( Constants.login_url, (result) { String data = result.toString(); print("AAAAA" + data); // bean = UserInfoBean.fromJson(result); Anim.goNextReplace(context, BasePage()); }, Tool.getParams1(dataStr), (error) { print("error:===>" + error); Tool.showToastShort(error.toString()); });
其中的dataStr 是請求的欄位:
var data = {"pageSize":100,"pageIndex":_page}; String dataStr = convert.jsonEncode(data);
其中post1和post的區別主要是請求欄位資料型別的區別一個是
Map<String,dynamic>
另一個是
FormData
主要看伺服器那邊要求是那種,另外伺服器返回的資料在HttpGo中已經將最外層解析了,所以post或post1方法裡返回的result是data欄位裡的資料而且資料型別是
Map<String, dynamic>
的而不是String型別的,如果是集合的話是一個Map集合可以放到list裡面解析如下:
List responseJson = result;
List<CollectItemBean> list = responseJson.map((m) => CollectItemBean.fromJson(m)).toList();