首页 > 其他分享 >Flutter 下载篇 - 贰 | 当下载器遇上切换网络库

Flutter 下载篇 - 贰 | 当下载器遇上切换网络库

时间:2023-03-04 09:47:33浏览次数:49  
标签:dio 网络 遇上 抽象 下载 download Flutter CancelToken

需求背景

继上篇《Flutter 下载篇 - 壹 | flutter_download_manager 源码解析》中详细介绍了 flutter_download_manager 用法和原理。在优缺点中提到,该库纯 Dart 实现,支持下载管理,暂停,恢复,取消和断点续传。其中有个缺点是网络库与 dio 强耦合,不支持自定义网络库扩展。

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

我想说:

  1. 世界不只有一种声音,那不然多无趣。
  2. 第三方库对应用本身来说是黑盒,开发者一般疏于关注其功能改动对应用影响除非产生重大事故,这种不可控的情况应谨慎。
  3. 设计上遵循 DIP 原则,抽象不要依赖具体实现细节,具体细节依赖抽象,我们需要抽象网络层来给项目依赖而非直接依赖 dio。
  4. 快速切换到其他网路库。

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

现状说明

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

类图体现

Untitled.png

代码体现

耦合点一:dio.CancelToken

Untitled 1.png

每个下载任务请求中都会使用到 dio:CancelToken 通过 dio 网络库间接实现任务的取消功能。

耦合点二:dio.download

cancelToken.cancel() 算依赖 CancelToken

Untitled 2.png

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

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

Untitled 3.png

如何定制网络库

通过上述对现状分析总结,结合设计基本原则:封装变化将不变从变化中隔离出来。其中变化的就是网络库的下载,CancelToken 和取消功能。只用封装这部分变化,将网络库下载和 Token 抽象出来进行封装。

1. 网络层设计

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

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

实施步骤

  1. 抽象网络层接口

考虑到 download 返回 Future 中对象问题,因为会用到 response.statusCode,这里直接用 dynamic 来,具体可以细化成封装成 DownloadResponse,其中包含 statusCode 属性。

Untitled 4.png

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

Untitled 5.png

2. CancelToken 设计

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

思路:CancelToken 与取消息息相关,而且必须提供一个 cancel 方法来供 downloadmanager 中暂停等方法使用。考虑到每个 custom_http_client 的 CancelToken 结构体存在不一样,而 cancel 方法命名多样性原则,这里设计一个统一的 DownloadCancelToken 接口,提供 cancel 方法,将其中实现代理给具体网络库的 CancelToken 对象。

实施步骤

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

小技巧: 用 Function.apply 是因为它本身支持位置参数和可选参数传入。

Untitled 6.png

  1. custom_http_client 中抽象一个 DownloadCancelToken 抽象接口供外部使用

Untitled 7.png

3. 下载器设计

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

思路:downloadmanager 中提供了 addDownload 等下载通用方法及下载管理逻辑抽象。这块存在变化可以有多种实现,也抽象下。

实施步骤:

  1. 下载器抽象成接口

Untitled 8.png

  1. downloadManager 依赖 IDownloader

Untitled 9.png

至此,可定制网络库改造已全部完成,接下来就可以隔离 dio 网络实现了。

网络库隔离效果

Untitled 10.png

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

Untitled 11.png

如此就完成了对 flutter_download_manager 的网络库扩展改造,实现了一个可定制化的网络框架的下载库。

完整源码传送门

总结

做开闭原则前,最重要的是以最小实现模型为基础捋清楚代码中的变与不变。

太棒了!鼓励自己坚持到底。我希望我为你投入的时间增加了一些价值。

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

❤️ 本文由 听蝉 原创,欢迎关注公众号:编程黑板报 原创技术文章第一时间推送。 ❤️

标签:dio,网络,遇上,抽象,下载,download,Flutter,CancelToken
From: https://www.cnblogs.com/xuge2it/p/17177620.html

相关文章

  • RocketMq 下载安装
    下载地址https://rocketmq.apache.org/zh/downloadlinux安装步骤启动nameserverbin目录下启动nameservernohupshmqnamesrv&查看nameserverlogtail-f~/......
  • maven下载安装
    Maven是一个项目架构管理工具Maven方便我们导入jar包Maven的核心思想:约定大于配置Maven下载步骤如下:1、打开官网:https://maven.apache.org/,点击download,选择合适的版本......
  • java通过url下载文件
    通过流的方式进行下载: 代码如下:/***通过url地址进行下载文件*@paramurl网页地址*@paramfileName文件名,不包含文件路径需要自己配置......
  • Landsat数据在USGS中无法下载Surface Reflectance产品的解决方法
      本文介绍在USGS官网下载Landsat遥感影像数据时,出现报错信息,无法下载地表反射率产品(SurfaceReflectance)的解决办法。  最近,利用这篇文章批量下载Landsat遥感影像的......
  • 下载工具类
    packagecom.wishcome.controller;importcom.wishcome.constants.Constants;importcom.wishcome.domain.SysAdmin;importcom.wishcome.exception.GlobalException;......
  • 成品直播源码,Flutter 夜间模式 全局字体
    成品直播源码,Flutter夜间模式全局字体 import'package:flutter/material.dart';import'package:flutter_widget/router/applicationRouterGradual.dart';import'pa......
  • Microsoft Visual Studio 2010 Service Pack 1官方下载版(ISO)
    1.用迅雷下载很快,总大小1.48G,安装过程中所需的所有msi程序包都在文件内。2.安装过程中,如果提示“无法访问你试图使用的功能所在的网络位置”,所需的所有msi文件都在这个1......
  • python+playwright 学习-20.文件下载expect_download()
    前言文件下载操作expect_download()当浏览器上下文关闭时,所有属于浏览器上下文的下载文件都会被删除。下载开始后会发出下载事件。下载完成后,下载路径可用:withpage.e......
  • 剖析flutter_download_manager学习如何做下载管理,暂停和取消
    前言内容类应用中图片或文件下载,一般应用中应用更新和升级,这些都是经典的下载场景。下载是项目中基础且重要的模块。从代码逻辑复用性和人力成本考虑,一直想实现一个纯Dar......
  • Python爬虫:原来微博上的视频下载链接在这啊
    最近看了一下网页版的微博,觉得那上面的视频不错,想获取它上面的下载链接,于是就写了这篇博文。1.几个视频播放平台的下载链接的实现1.西瓜视频西瓜视频这个平台上面......