关于flutter:Flutter-下载篇-贰-当下载器遇上切换网络库

51次阅读

共计 1787 个字符,预计需要花费 5 分钟才能阅读完成。

需要背景

继上篇《Flutter 下载篇 – 壹 | flutter_download_manager 源码解析》中具体介绍了 flutter_download_manager 用法和原理。在优缺点中提到,该库纯 Dart 实现,反对下载治理,暂停,复原,勾销和断点续传。其中有个毛病是网络库与 dio 强耦合,不反对自定义网络库扩大。

有人会说: dio 这么牛逼,间接用不就好了,为啥还要反对别的网络库,没事别瞎折腾。

我想说:

  1. 世界不只有一种声音,那不然多无趣。
  2. 第三方库对利用自身来说是黑盒,开发者个别疏于关注其性能改变对利用影响除非产生重大事故,这种不可控的状况应审慎。
  3. 设计上遵循 DIP 准则,形象不要依赖具体实现细节,具体细节依赖形象,咱们须要形象网络层来给我的项目依赖而非间接依赖 dio。
  4. 疾速切换到其余网路库。

本文将从现状登程,一步步带你解耦 flutter_download_manager 中的网络库。

现状阐明

从类图上整体理解 flutter_download_manager 类设计过程中对 dio 强耦合概括,而后通过代码具体解说。

类图体现

代码体现

耦合点一:dio.CancelToken

每个下载工作申请中都会应用到 dio:CancelToken 通过 dio 网络库间接实现工作的勾销性能。

耦合点二:dio.download

cancelToken.cancel() 算依赖 CancelToken

如上简写代码中调用链关系,最终调用链及对 dio 依赖关系总结:

下载库对 dio 的依赖在于: CancelToken 和 download 办法

如何定制网络库

通过上述对现状剖析总结,联合设计根本准则:封装变动将不变从变动中隔离进去。其中变动的就是网络库的下载,CancelToken 和勾销性能。只用封装这部分变动,将网络库下载和 Token 形象进去进行封装。

1. 网络层设计

目标:让 flutter_download_manager 与 dio.download 解耦。

思路:将网络相干操作形象成接口,依赖注入到 downloadManager 对象中。

施行 步骤

  1. 形象网络层接口

思考到 download 返回 Future 中对象问题,因为会用到 response.statusCode,这里间接用 dynamic 来,具体能够细化成封装成 DownloadResponse,其中蕴含 statusCode 属性。

  1. customhttpclient 通过依赖注入传入 DownloadManager,让其不依赖具体实现而依赖形象,依赖注入实现对象之间的组合关系进步扩展性。

2. CancelToken 设计

目标:让 flutter_download_manager 与 dio.CancelToken 解耦。

思路:CancelToken 与勾销非亲非故,而且必须提供一个 cancel 办法来供 downloadmanager 中暂停等办法应用。思考到每个 custom_http_client 的 CancelToken 构造体存在不一样,而 cancel 办法命名多样性准则,这里设计一个对立的 DownloadCancelToken 接口,提供 cancel 办法,将其中实现代理给具体网络库的 CancelToken 对象。

施行步骤

  1. 形象一个 Token 对象并提供 cancel 办法,并实现一个默认代理其余网络库的 Proxy 类。

小技巧: 用 Function.apply 是因为它自身反对地位参数和可选参数传入。

  1. custom_http_client 中形象一个 DownloadCancelToken 形象接口供内部应用

3. 下载器设计

目标:下载器与具体实现 downloadmanager 解耦

思路:downloadmanager 中提供了 addDownload 等下载通用办法及下载治理逻辑形象。这块存在变动能够有多种实现,也形象下。

施行步骤:

  1. 下载器形象成接口
  1. downloadManager 依赖 IDownloader

至此,可定制网络库革新已全副实现,接下来就能够隔离 dio 网络实现了。

网络库隔离成果

通过依赖注入到 DownloadManager 中即可。

如此就实现了对 flutter_download_manager 的网络库扩大革新,实现了一个可定制化的网络框架的下载库。

残缺源码传送门

总结

做开闭准则前,最重要的是以最小实现模型为根底捋分明代码中的变与不变。

❤️本文由 编程黑板报 原创,欢送关注同名公众号,原创技术文章第一工夫推送。❤️

正文完
 0