共计 1787 个字符,预计需要花费 5 分钟才能阅读完成。
需要背景
继上篇《Flutter 下载篇 – 壹 | flutter_download_manager 源码解析》中具体介绍了 flutter_download_manager 用法和原理。在优缺点中提到,该库纯 Dart 实现,反对下载治理,暂停,复原,勾销和断点续传。其中有个毛病是网络库与 dio 强耦合,不反对自定义网络库扩大。
有人会说: dio 这么牛逼,间接用不就好了,为啥还要反对别的网络库,没事别瞎折腾。
我想说:
- 世界不只有一种声音,那不然多无趣。
- 第三方库对利用自身来说是黑盒,开发者个别疏于关注其性能改变对利用影响除非产生重大事故,这种不可控的状况应审慎。
- 设计上遵循 DIP 准则,形象不要依赖具体实现细节,具体细节依赖形象,咱们须要形象网络层来给我的项目依赖而非间接依赖 dio。
- 疾速切换到其余网路库。
本文将从现状登程,一步步带你解耦 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 对象中。
施行 步骤:
- 形象网络层接口
思考到 download 返回 Future 中对象问题,因为会用到 response.statusCode,这里间接用 dynamic 来,具体能够细化成封装成 DownloadResponse,其中蕴含 statusCode 属性。
- customhttpclient 通过依赖注入传入 DownloadManager,让其不依赖具体实现而依赖形象,依赖注入实现对象之间的组合关系进步扩展性。
2. CancelToken 设计
目标:让 flutter_download_manager 与 dio.CancelToken 解耦。
思路:CancelToken 与勾销非亲非故,而且必须提供一个 cancel 办法来供 downloadmanager 中暂停等办法应用。思考到每个 custom_http_client 的 CancelToken 构造体存在不一样,而 cancel 办法命名多样性准则,这里设计一个对立的 DownloadCancelToken 接口,提供 cancel 办法,将其中实现代理给具体网络库的 CancelToken 对象。
施行步骤:
- 形象一个 Token 对象并提供 cancel 办法,并实现一个默认代理其余网络库的 Proxy 类。
小技巧: 用 Function.apply 是因为它自身反对地位参数和可选参数传入。
- custom_http_client 中形象一个 DownloadCancelToken 形象接口供内部应用
3. 下载器设计
目标:下载器与具体实现 downloadmanager 解耦
思路:downloadmanager 中提供了 addDownload 等下载通用办法及下载治理逻辑形象。这块存在变动能够有多种实现,也形象下。
施行步骤:
- 下载器形象成接口
- downloadManager 依赖 IDownloader
至此,可定制网络库革新已全副实现,接下来就能够隔离 dio 网络实现了。
网络库隔离成果
通过依赖注入到 DownloadManager 中即可。
如此就实现了对 flutter_download_manager 的网络库扩大革新,实现了一个可定制化的网络框架的下载库。
残缺源码传送门
总结
做开闭准则前,最重要的是以最小实现模型为根底捋分明代码中的变与不变。
❤️本文由 编程黑板报 原创,欢送关注同名公众号,原创技术文章第一工夫推送。❤️