由于水平有限,网上有很多看起来封装很好的例子,有一些代码没有看明白使用场合,先简单封装了一下,在自己项目中用着舒服就行了,毕竟这个封装需要考虑后端的一些实现方式,先看下封装的代码:
/*
* 作者:shangjunfei
* 上次修改时间:2019年10月11日 16:36:54
* Copyright(c) 2019
*/
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:wxiot/config/Config.dart';
import 'package:wxiot/mainpage/loginPage.dart';
import 'package:wxiot/model/UserInfo.dart';
//简单单例封装
class HttpDio {
Dio dio;
static HttpDio _instance;
static HttpDio getInstance() {
if (_instance == null) {
_instance = new HttpDio();
}
return _instance;
}
HttpDio() {
BaseOptions options = BaseOptions();
options.connectTimeout = 10 * 1000;
options.receiveTimeout = 20 * 1000;
dio = new Dio();
dio.options = options;
dio.interceptors.add(CookieManager(CookieJar())); //支持cookie
}
///get请求简单封装,后面再优化,为了不重复很多代码
get(url, data, context, callback) async {
try {
Response response = data != null
? await dio.get(url, queryParameters: data)
: await dio.get(
url,
);
callback(response);
} on DioError catch (e) {
print(e); //TODO:发布时屏蔽
if (e.response?.statusCode == 401) {
showToast("凭证过期,重新登录中。。。", duration: Duration(seconds: 3));
relogin(context);
Navigator.pop(context, "relogin");
} else {
showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
}
} catch (exception) {
print(exception); //TODO:发布时屏蔽
showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
}
}
///post请求简单封装,后面再优化
post(url, data, context, callback) async {
try {
Response response = await dio.post(url, data: data);
callback(response);
} on DioError catch (e) {
if (e.response.statusCode == 401) {
relogin(context);
showToast("凭证过期,重新登录中。。。", duration: Duration(seconds: 3));
Navigator.pop(context, "relogin");
} else {
showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
}
} catch (exception) {
showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
}
}
//登录
login(url, data, context, callback) async {
try {
Response response = await dio.post(url, data: data);
// print(response.toString());
callback(response);
} on DioError catch (e) {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('出错了,请联系管理员'),
duration: Duration(seconds: 2),
));
} catch (exception) {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('出错了,请联系管理员'),
duration: Duration(seconds: 2),
));
}
}
}
除了常用的get和post方法,单独封装了一下login接口,是因为该项目采用了cookie,有的时候会超时,需要后台刷新一下登录信息,登录的处理逻辑略有不同。
下面是具体使用的栗子代码:
_showDetail(String devId) async {
LoadingPage loadingPage = new LoadingPage(context);
loadingPage.show();
var url = Config.getDeviceInfoUrl;
var formData = {
"dev_id": devId,
};
HttpDio.getInstance().get(url, formData, context, (response) {
if (response.data['code'] == 1) {
var res = jsonDecode(response.toString());
var data = res['data'];
DeviceInfo deviceInfo = DeviceInfo(data['deviceInfo']);
loadingPage.close();
DeviceDetailFactory deviceDetailFactory =
new DeviceDetailFactory(context, deviceInfo);
deviceDetailFactory.showDetail();
} else {
showToast(response.data['msg'], duration: Duration(seconds: 3));
}
});
}
基本一目了然,不用多做解释,顺便吐槽一下csdn的代码编辑,居然没有dart语言可选,呵呵。