RxDio是在练习Dio、RxDart、Sql的时候,仿照Android网络请求OkGo做的,只实现了简单的功能,后续有需要再完善。
在APP开发中,经常会遇到这样一种情况:
在有网络正常的时候,展示网络数据,在网络断开或者网络很差的时候,展示上次正常访问的数据
理想的解决方法是,设置几种缓存模式:
1、只请求网络
2、只访问缓存
3、先访问缓存,再请求网络
4、没有缓存再请求网络
目前仅支持GET,POST请求。
缓存模式支持:
1 NO_CACHE, //没有缓存
2 DEFAULT, //按照HTTP协议的默认缓存规则(暂未实现)
3 REQUEST_FAILED_READ_CACHE, //先请求网络,如果请求网络失败,则读取缓存,如果读取缓存失败,本次请求失败
4 FIRST_CACHE_THEN_REQUEST, //先使用缓存,不管是否存在,仍然请求网络
用到的库有:
rxdart: ^0.22.2 #RxDart
crypto: ^2.1.3 #MD5加密
dio: ^2.2.2 #dio网络请求
sqflite: ^1.1.6+5 #sqflite数据库
基本使用
1、添加依赖:
rxdio:
git:
url: git://github.com/kukugtu/RxDio.git
2、发起请求
由于没有添加参数,故会得到一个参数错误返回结果。
RxDio()
..setBaseUrl("https://web.kukugtu.top:8092")
..setPath("/UGrowService/ListReport")
..setCacheMode(CacheMode.NO_CACHE)
..setMethord(REQUEST_METHORD.GET)
..call(
new NetCallback(onCacheFinish: (data) {
print("onCacheFinish");
print(data.toString());
}, onNetFinish: (data) {
print("onNetFinish");
print(data.toString());
}, onUnkownFinish: (data) {
print("onUnkownFinish");
print(data.toString());
}),
);
添加参数:
Map<String, String> params = new Map();
params["page"] = "1";
params["pageSize"] = "10";
params["state"] = "1";
RxDio()
..setBaseUrl("https://web.kukugtu.top:8092")
..setPath("/UGrowService/ListReport")
..setParams(params) //用Map作为容器,添加参数
..setCacheMode(CacheMode.NO_CACHE)
..setMethord(REQUEST_METHORD.GET)
。。。。。。。。
添加Json解析
Json解析可以在Callback中手动解析,也可以添加Json解析器,并使用泛型进行规范。
RxDio<News>()
..setBaseUrl("https://web.kukugtu.top:8092")
..setPath("/UGrowService/ListReport")
..setParams(params)
..setCacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)
..setJsonTransFrom((data) {
return News.fromJson(json.decode(data));
//此处Json解析使用了json_serializable,也可使用其他其他解析
//此处解析返回的对象,是callback中的data。
//此处也可做其他的操作
//若添加了泛型,且不为String,则必须添加解析器
})
..setMethord(REQUEST_METHORD.GET)
..call(
new NetCallback(onCacheFinish: (data) {
print("onCacheFinish");
print(data.toString());
print("onCacheFinish内容1" + data.data[0].content);
print("onCacheFinish内容2" + data.data[1].content);
print("onCacheFinish内容3" + data.data[2].content);
}, onNetFinish: (data) {
print("onNetFinish");
print(data.toString());
print("onNetFinish内容1" + data.data[0].content);
print("onNetFinish内容2" + data.data[1].content);
print("onNetFinish内容3" + data.data[2].content);
}, onUnkownFinish: (data) {
print("onUnkownFinish");
print(data.toString());
print("onUnkownFinish内容1" + data.data[0].content);
print("onUnkownFinish内容2" + data.data[1].content);
print("onUnkownFinish内容3" + data.data[2].content);
}),
);
Json解析此处使用了json_serializable
总结
缓存保存是本库最大的特点,支持缓存与网络同时回调,能够最大限度的定制网络数据缓存逻辑。与某些带缓存的图片访问框架配合,几乎可以达到离线浏览的目的。目前该库恨不完善,后续会添加缓存管理、过期等操作,欢迎留言分享各种好想法。
原创作品,转载请注明 Author:Kukugtu。
GitHub地址:https://github.com/kukugtu/RxDio