利用flutter_downloader插件在Flutter中实现文件下载

2023-12-18 15:48

本文主要是介绍利用flutter_downloader插件在Flutter中实现文件下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

之前有做一个工具集的微信小程序「开挂Lite」,但是由于小程序自身限制,没有办法实现下载文件的功能,只能把下载链接解析出来。而且受限于微信平台,小程序的审核是一件很麻烦的事情,因此有了将其APP化的想法。

自从去年Flutter横空出世后,我便一直关注它的发展,时隔一年后重新拾起,发现它的生态已经初具规模,于是决定采用Flutter重做一个「开挂Lite」。后期我也会不定时更新一些和Flutter有关的文章,希望大家可以多多支持。本文记录的便是我利用Flutter实现文件下载功能的过程。

完整源码可在公众号:「01二进制」后台回复:「Flutter 文件下载」获取

开始

我们先看一下实现的效果:

iOS

Android

本demo的实现效果非常简单,就是点击一个按钮,然后下载文件,完成后提示用户是否打开文件。

准备工作

在本 demo 中使用的 IDE 为 Android Studio ,同时使用到了以下几个库:

我们先新建一个空项目,然后将上述依赖添加到项目的 pubspec.yaml 文件,添加位置如下:

接下来我们可以在 Terminal 中输入 flutter packagesget 或者点击 IDE 左上角的 Packagesget 字样安装依赖。

然后将初始项目中的多余代码删除,并在中间添加一个按钮。

其中 _doDownloadOperation() 便是我们执行下载操作的方法,至此,前期准备工作结束。

逻辑分析

虽然整个下载演示的过程非常简单,但还是有必要来分析整个下载的流程,如下图所示:

所以我们接下来要做的事情便是:

  1. 获取权限:网络权限、存储权限

  2. 获取下载路径

  3. 设置下载回调(用于监听下载过程)

操作

获取权限

这里使用到一个权限获取插件: permission_handler ,这个插件提供了跨平台(Android和iOS)的权限检查以及获取API,地址在:https://pub.flutter-io.cn/packages/permission_handler。在获取权限前我们需要先申明权限(Android)。

打开项目根目录下的 android/app/src/main/AndroidManifest.xml 文件,位置如下图所示:

然后添加我们需要使用的权限的申明,如下图所示:

接下来我们就可以写代码来获取所需的权限了。创建一个 _checkPermission() 函数用于判断权限是否给予。当然由于平台差异,我们需要判断其为Android平台,申请代码如下:

获取下载路径

这里是使用的插件是 path_provider ,它是一个配合Dart的IO库以便在Flutter中实现文件读写的插件,Flutter中文网对该插件有着详细的介绍(https://flutterchina.club/reading-writing-files/),这里我们需要明白一个问题,就是iOS没有外置存储这一概念,因此需要对平台进行判断,代码如下:

通过上述代码我们便可以获取存储路径,但是如果我们不想把文件下载到存储路径呢?比如我就喜欢单独设置一个 /Download 路径专门用于保存下载文件,其实也很简单:

下载文件

下载文件这里我找了一些资料,发现貌似只有一个 flutter_downloader 插件,也不知道是什么情况。该插件的配置过程也是挺复杂的,好在文档(https://pub.flutter-io.cn/packages/flutter_downloader)写的还算明白。这个插件可以实现后台下载,分别基于 Android 中的 WorkManager 和 iOS 中的 NSURLSessionDownloadTask 实现的。

接下来分别说下在iOS端和Android端的设置。

插件配置

iOS端配置

  • 启用  background mode

想要执行这一步,我们在Xcode中打开该项目的 iOS module ,如下图所示:

然后双击左侧 Runner 选项,选择 Capabilities 选项,按图中所示启用 background mode

  • 添加  sqlite 依赖库

文档中还提供了一些 可选配置 :

  • 设置 HTTP 请求支持

为了安全起见,苹果官方已经默认不让开发者使用不安全的http通信协议了,而是建议开发者使用安全的https协议。若我们还是需要使用 http 协议需要做一些配置,文档中给了两种方式配置,一种是允许单个HTTP请求的域名,另一种是允许所有HTTP请求的域名,这里出于演示目的,选择第二种。

只需要在 Info.plist 文件中添加如下代码即可:

  • 设置最大同时下载数

默认支持同时下载最多3个文件,如果你需要更改同样需要更改 Info.plist

  • 设置下载完成通知

同样的,修改 Info.plist :

Android端配置

说完了iOS端的配置,我们再来说下Android端的配置。在 AndroidManifest.xml 文件中添加如下代码:

位置如下:

还有其他类似于iOS端的可选配置,功能大同小异,这里就不说了,详见官网。

编写下载代码

配置结束后,其实下载的代码很简单:

当然我们需要提前引入 flutter_downloader 库

文档中还提供了其他API,譬如暂停下载、取消下载,这里就不再阐述了,文档已经写的很清楚了。

到这其实就已经完成了下载的逻辑,然而下载的逻辑是实现了,想要让用户用的明白,我们还需要加一些提示信息,就像开头demo展示的有下载进度条和下载完成的提示框,接下来我们就来为下载设置这些提示信息吧。

设置下载提示信息

这里以对话框和进度条的形式展现下载过程,我们使用到了 progress_dialog 这个插件,可以很方便的显示出一个下载对话框,地址是https://pub.flutter-io.cn/packages/progress_dialog。

使用 progress_dialog 插件非常简单,首先我们引入依赖文件:

然后创建一个对话框:

如果想要创建一个下载提示对话框的话我们只需要在合适的地方初始化这个Dialog:

然后执行 pr.show(); 即可显示对话框。取消这个对话框也非常的简单,只需执行 pr.hide();

如果想要更新对话框中的提示信息,比如下载进度,只需执行下述代码:

同时我们还可以通过 isShowing() 函数判断对话框是否显示

是不是非常方便呢?

有了展示的对话框,下一步自然就是获取下载进度了,好在 flutter_downloader 已经给我们提供了一个下载回调,我们可以在下面的这个回调函数中更新我们的UI。

其中 id 是下载任务的id, status 是当前id下载任务的状态,有 undefined,enqueued,running,complete,failed,canceled,paused 这几种状态, progress 便是当前id下载任务的进度。

这里方便起见我选择在 initState() 函数中初始化下载回调函数和对话框:

然后我们需要根据下载的状态分情况讨论

其实到这里下载文件的操作就算结束了,但是通常在下载完成后APP都会提示你是否要打开,于是在这我们干脆 就拓展一下,实现打开我们已经下载好的文件。

打开下载完成的文件

那如何打开已经下载好的文件呢?插件已经提供好了打开下载文件的API,我们只需要像下面这样使用就可以了。

想要打开已经下载完成的文件,我们必须要要确保文件已经下载好了。所以我们需要紧接上面的代码中判断下载完成的函数。这里我们以弹出对话框的形式询问用户是否打开文件。

代码如下

对话框的使用上述代码已经注释的很详细了。

至此,我们便使用 Flutter 完成了一个完整的下载文件的过程了。

总结

总的来说,利用Flutter实现文件下载的思路还是很清楚的, 获取权限->获取路径->开始下载->监听下载进程 ,一气呵成。同时,借助于 Flutter 社区的快速发展,已经有很多优秀的开发者开发了一些非常好用的插件,凭借着这些插件我们可以快速实现自己想要的功能。在这个demo中整个界面编写+逻辑实现总共也才 223 行代码,虽然界面有些丑陋,但考虑到Dart语言的迷之缩进这个行数也是很短的了。

最后想要源码可以扫描下面的二维码关注我的公众号「01二进制」,后台回复「Flutter 文件下载」即可,后期我也会不定时更新一些和Flutter有关的文章,希望大家可以多多支持。

原文https://www.tuicool.com/articles/EJ7jmy7

这篇关于利用flutter_downloader插件在Flutter中实现文件下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508966

相关文章

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码