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 to  mark 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,网络库,okhttp,开源源码)