Flutter|Flutter 基于Dio的网络库封装(开源项目)

  • 此文初衷:做flutter项目已经有一段时间了,已有多个flutter项目稳定迭代了一年半载了,在此正在写一个Flutter专题的内容,准备回馈社区同时和更多开发者交流一起成长。
  • 项目简介:做原生项目的时候我们有volley、OkHttp、retrofit等方便易用的成熟网络框架,flutter比较火的网络库则是dio库,但是使用起来的时候却没有retrofit或者Okhttp那么顺手,同时
  • 因为在pub.dev上已有retrofit的封装,开发的时候觉得逻辑很清晰但是代码也很多,而且组内大部分开发者都喜欢了callback回调处理的方式,在开发的时候针对网络的情况还需要做统一
  • 的全局处理,所以接到任务简单整理了一下需求,如果你的项目中有同样的需求可以快速接入此库开发,如果没有下面的全部需求这个库也可以简化网络方面的开发。
  • 项目需求:
  1. 简单易用,支持常用的请求方法;
  2. 可单独亦可全局处理网络结果;
  3. 可以追踪和取消某一类网络请求;
  4. 可同步可异步处理返回结果;
  5. 打印日志可输入到文档方便分享查阅;
  6. 支持header、params格式等多种方式的定制;
  7. dio库支持的功能此库全都支持,目的在于方便封装自己项目的网络框架,更便捷的使用它。
  8. 后续想法是此库支持更多的其他网络库,方便用户选择,但是在方便开发者切换核心网络框架的同事对已经使用此库的api的项目不产生影响(排期中)
  • 需求分析与解决方案
  1. 简答易用,针对1、6这两个需求明显这是一个可配置且参数众多的需求,所以我想到的是用构建者模式去解决这一问题,简单的链级操作一直是我写代码是最喜欢的方式之一。
  2. 可单独追踪就是针对每一次网络请求都可以设置特殊的的标识id,在这里提供buildid是根据url的值,用户也可自定义,可以取消某一个,或者某一类,类比我们实际使用场景退出某个界面就取消该页面的网络请求。
  3. 虽然写过RN 和Flutter但是作为一个老Android来说还是习惯回调callback的方式处理,所以考虑到团队的情况在这里就用了callback的方式来处理,其实也可以用flutter的Future方式,但是对新手来说asyc和await的用法难免会让他们头痛,所以我就在库里面代劳处理了一下,因为提供了同步处理请求和异步请求两种方式,同步可以立即拿到网络结果,异步需要开发者自己处理callback,整体项目汇总建议用callback这样可以批量处理所有的网络异常。
  4. 用户可以自己定义日志的打印方式,这里因为部分原因所以隐藏了该方法,有需求可以直接在下面项目地址源码中开发,使用时请注明出处哦,这是一个急需尊重知识的时代希望大家不贡献力量也别破坏它,谢谢。
  • 用法举例:此项目的核心类是bulider.dart文件,注释里面都有言明核心项目的用法,现在上传网络有异常后期会将项目传到pub.dev上,方便大家引用
/// - [Usage] asyncRequest: /// /// 1. class _MyHomePageState extends State implements OnRequestCallBack ///@override ///dynamic onPreRequest(YeeRequestOption request); ///@override ///void onError(YeeDioError e) {} ///@override ///void onResponse(YeeResponse result) {} /// /// 2.How to crate a asyncRequest builder ///YeeHttpBuilder _yeeHttpBuilder = new YeeHttpBuilder(context: this) ///.baseUrl("https://jsonplaceholder.typicode.com/posts") ///.method(HttpConfigs.GET) ///.build(); ///NOTE: if params is form-urlencoded please set this.formDataParams(true) /// /// 3.To async request the jsonToBean object(type:dynamic) ///_yeeHttpBuilder.asyncRequest(); /// /// 4.Destroy builder while widget will be in background, Every builder has itself cancelToken ///_yeeHttpBuilder.cancelToken(true); /// /// /// - [Usage] syncRequest: /// 1.YeeHttpBuilder _yeeHttpBuilder = new YeeHttpBuilder() ///.baseUrl("https://jsonplaceholder.typicode.com/posts") ///.method(HttpConfigs.GET) ///.build(); /// 2.To sync receive the jsonToBean object(type:dynamic) ///dynamic response =await _yeeHttpBuilder.syncRequest(); /// /// - [Usage] Download: /// Tips: While file's size more than 5MB, we recommend using downloadLargeFile to increase download speed , another side we use downloadSmallFile /// 1.YeeHttpBuilder builder = new YeeHttpBuilder(ignoreDefaultHttpConfig: true) ///.method(HttpConfigs.GET) ///.baseUrl(urlLarge) ///.log(true) ///.build(); /// /// 2. dynamic result = await builder.downloadLargeFile( ///"[your save path]", onReceiveProgress: (received, total) async{ ///if (total != -1) { ///print("progress:" + (received / total * 100).toStringAsFixed(0) + "%"); ///} ///}); /// /// - [Usage] CacheInterceptor /// 1.Tips: There's always some data we don't need it in real time so we can ask for it from http cache ///YeeHttpBuilder builder = new YeeHttpBuilder() ///.method(HttpConfigs.GET) ///.baseUrl(urlWeb) ///.addInterceptor(CacheInterceptor()) ///.log(true) ///.build(); /// ///2.await builder.syncRequest(); //first request form Intent ///await builder.syncRequest(); //second request form our local cache ///builder.forceRefreshCache(true); //ignore local cache, ask for data from Intent ///await builder.syncRequest(); //third request form Intent again /// /// - [Usage] Verify Https Certificate: /// 1.Custom your certificate by setting pem string with YeeHttpBuilder.httpsCertificate(certificate) /// /// 2.【Not Recommending】Ignore verify by setting YeeHttpBuilder.verifyHttpsCertificate(false), default value{true}. /// ///YeeHttpBuilder builder = new YeeHttpBuilder() ///.method(HttpConfigs.GET) ///.baseUrl(urlJson) ///.log(true) ///.httpsCertificate("your pem string") //custom https certificate which format is pem ///.verifyHttpsCertificate(false) //ignore https verify, Not Recommend!!! ///.build(); /// /// - [Usage] Params Type: Map(default)\FormData /// 1.Map /// 2.YeeHttpBuilder.formDataParams(true) transform Map to FormData /// ///- [Usage] Track Request: You can set one more id(.id("xxx)) for every YeeHttpBuilder instance tomark every network request ///1. if not we support default id for you {@link _createDefaultUniqueKey()} ///2. YeeHttpBuilder _yeeHttpBuilder = new YeeHttpBuilder() ///.baseUrl("https://jsonplaceholder.typicode.com/posts") ///.method(HttpConfigs.GET) ///.id("your mark") ///.build(); ///3.you can track "your mark" in {@link OnRequestCallBack}method like: ///@override ///void onResponse(YeeResponse response) { ///print("YeeHttpBuilderUtil_onResponse:"); ///if (response.builderID() == "your mark") { /////TODO your deal ///} ///if (response.builderID() == "another mark") { /////TODO your deal ///} ///} ///

  • 项目地址:https://github.com/DennisJu007/easy_dio
  • 写在最后:开源项目,但也请最终原创,转发商用请注明出处,同时欢迎一起学习交流共同进步,谢谢。
【Flutter|Flutter 基于Dio的网络库封装(开源项目)】

    推荐阅读