带缓存的Flutter网络请求——RxDio

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flutter网络请求dio封装是一种常用的网络请求框架,它可以帮助我们快速地进行网络请求,同时也可以提高我们的开发效率。在使用dio进行网络请求时,我们可以通过封装来简化代码,提高代码的可读性和可维护性。常见的封装方式有: 1. 封装请求方法:将网络请求的方法封装成一个函数,可以传入参数,方便调用。例如: ``` Future<Response> post(String url, Map<String, dynamic> data) async { try { Response response = await Dio().post(url, data: data); return response; } catch (e) { throw e; } } ``` 2. 封装请求拦截器:可以在请求前或请求后进行一些操作,例如添加请求头、打印请求日志等。例如: ``` class HttpUtil { static Dio dio = Dio(); static Future<Response> get(String url, {Map<String, dynamic> params}) async { dio.interceptors.add(InterceptorsWrapper( onRequest: (options, handler) { // 添加请求头 options.headers['Authorization'] = 'Bearer token'; return handler.next(options); }, onResponse: (response, handler) { // 打印请求日志 print('response: ${response.data}'); return handler.next(response); }, )); try { Response response = await dio.get(url, queryParameters: params); return response; } catch (e) { throw e; } } } ``` 3. 封装错误处理:可以统一处理网络请求的错误,例如网络异常、请求超时等。例如: ``` class HttpUtil { static Dio dio = Dio(); static Future<Response> get(String url, {Map<String, dynamic> params}) async { try { Response response = await dio.get(url, queryParameters: params); return response; } on DioError catch (e) { if (e.type == DioErrorType.CONNECT_TIMEOUT) { throw '请求超时'; } else if (e.type == DioErrorType.RECEIVE_TIMEOUT) { throw '响应超时'; } else if (e.type == DioErrorType.RESPONSE) { throw '请求异常,状态码:${e.response.statusCode}'; } else if (e.type == DioErrorType.CANCEL) { throw '请求取消'; } else { throw '网络异常'; } } } } ``` 通过封装,我们可以让代码更加简洁、易读、易维护,同时也可以提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值