flutter 文件下载及存储路径

news2024/12/23 18:18:01

flutter 文件下载及存储路径

  • 前言
  • 一、下载进度条
  • 二、文件路径
  • 二、文件上传
  • 总结


前言

日常开发中,经常会遇到下载文件的功能,往往我们在需要保存文件的路径上去调试,比如Android中的路径,有些会报错在SD卡中,但是有些手机,又没有SD卡,那么我们该怎么办呢?


一、下载进度条

为了功能的完善,往往需要一个下载的进度条,当然,UI怎么美化不管,核心代码如下:

Container(
        padding: EdgeInsets.symmetric(horizontal: 32.w),
        height: Get.height,
        alignment: Alignment.center,
        child: Obx(
          () => Container(
            decoration: BoxDecoration(
              borderRadius: BorderRadius.all(
                Radius.circular(4.r),
              ),
              color: Colors.white,
            ),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                Padding(
                  padding: EdgeInsets.only(top: 22.h, bottom: 4.h),
                  child: Text(
                    '发送文件',
                    style: TextStyles.normalTextStyle(
                      fontSize: 17.sp,
                      fontWeight: FontWeight.w500,
                    ),
                  ),
                ),
                Container(
                  width: Get.width,
                  padding:
                      EdgeInsets.only(right: 24.w, left: 24.w, bottom: 12.h),
                  child: Column(
                    children: [
                      Padding(
                        padding: EdgeInsets.only(
                          top: 8.h,
                          bottom: 12.h,
                        ),
                        child: Text(
                          controller.scheduleLoad.value != '100'
                              ? '文件正在下载中,请稍候'
                              : '文件已下载完成',
                          style: TextStyles.normalTextStyle(
                            fontSize: 14.sp,
                            color: Colours.textGrey9,
                          ),
                        ),
                      ),
                      InkWell(
                        onTap: controller.scheduleLoad.value == '100'
                            ? () {
                                shareDialog(title);
                              }
                            : null,
                        child: Container(
                          height: 74.h,
                          alignment: Alignment.center,
                          child: SizedBox(
                            height: 40.h,
                            child: Stack(
                              children: [
                                ClipRRect(
                                  borderRadius:
                                      BorderRadius.all(Radius.circular(20.r)),
                                  child: SizedBox(
                                    height: 40.h,
                                    child: LinearProgressIndicator(
                                      value: double.tryParse(
                                          controller.scheduleLoad.value),
                                      backgroundColor: Colours.blueBtnBg02,
                                      valueColor: const AlwaysStoppedAnimation(
                                        Colors.blue,
                                      ),
                                    ),
                                  ),
                                ),
                                Center(
                                  child: Text(
                                    controller.scheduleLoad.value != '100'
                                        ? "下载进度${controller.scheduleLoad.value}%"
                                        : '分享文件',
                                    textAlign: TextAlign.center,
                                    style: TextStyles.normalTextStyle(
                                      color: Colors.white,
                                      fontSize: 14.sp,
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      )

上面的代码中,定义了一个视图,用来展示下载进度的信息,这里我使用的是getx 的状态管理,直接使用Obx进行下载数据的实时监听刷新。

二、文件路径

首先我们需要传入一个文件的下载路径,然后使用三方插件path_provider来获取文件的路径。

    if (filePath != null) {
      String? docPath;
      if (Platform.isAndroid) {
        docPath = "/storage/emulated/0/Download/";
        Directory dir = Directory(docPath);
        try {
           dir.listSync();
        }catch (e){
          // 一些系统没有权限
          docPath = (await getExternalStorageDirectory())?.path;
          docPath = '$docPath/';
        }
      } else {
        docPath = (await getTemporaryDirectory()).path;
        docPath = docPath.replaceFirst("Library/Caches", "Documents/");
      }
      loadFilePath = '$docPath$name.docx';
    }

上面的代码中,docPath 定义的一个路径,字面意思就是模拟器中的外部下载文件路径,但是在有些手机中,没有外部SD卡,那么我们再获取一下当前设备的内部SD卡路径, (await getTemporaryDirectory()).path, 其实getTemporaryDirectory 字面意思也是获取的外部存储路径,但是在没有外部SD卡的时候,他会获取内部的存储路径。

二、文件上传

文件上传部分,直接使用Dio 中封装好的方法就行

      await Dio()
          .download(filePath, loadFilePath, onReceiveProgress: (int received, int total) {
        if (total != -1) {
          scheduleLoad.value = (received / total * 100).toStringAsFixed(0);
        }
      });

到此为止,整个文件的下载保存功能就做完了,可以直接在手机的下载文件目录中查看下载的文件


总结

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发前置知识二:多线程不安全的本质

一、前言 这些年,我们的cpu、内存和i/o设备都在不断迭代,不断朝着更快的方向努力。但是,在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度。 cpu是天上1天,内存是地上1年cpu是天上1天&am…

万字长文 详细讲述 计算机网络层

文章目录 网络层网络层的几个重要概念网络层的两个层面 网际协议 IP虚拟互连网络IP 地址IP 地址及其表示方法IP 地址与 MAC 地址地址解析协议 ARPIP 数据报的格式 IP层转发分组过程基于终点的转发最长前缀匹配 网际控制报文协议 ICMPICMP 报文的种类ICMP 的应用举例IPv6 的基本…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷③

单元测试 一、任务要求 题目1:输入一个大写字母一个小写字母。根据输入的第一个字母和英文周几单词的第一个大写字母判断是周几,如果无法根据第一个大写字母判断,则继续根据输入的第二个小写字母进行判断,最终返回正确的英文周几…

【Redis】Redis面试热点

Redis 集群有哪些方案? 主从复制:解决了高并发问题 哨兵模式:解决了高并发,高可用问题 分片集群:解决了海量数据存储,高并发写的问题 主从复制 图示: 主从复制:单节点 Redis 并发…

python进行简单的app自动化测试(pywinauto)+ 截屏微信二维码

一、开始需要了解准备 1、安装 pip install pywinauto2、选择(后面会通过工具进行判断用哪个) 3、自动化控制进程的范围 示例 Application单进程 Desktop多进程 4、程序辅助检测工具 3中的下载连接 链接 点击放大镜拖到对应位置即可 二、简单的开始…

梦想贩卖机升级版知识付费源码,包含前后端源码,非线传,修复最新登录接口问题

梦想贩卖机升级版,变现宝吸收了资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用…

yolov8n 瑞芯微RKNN和地平线Horizon芯片仿真测试部署,部署工程难度小、模型推理速度快

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 因为之前写了几篇yolov8模型部署的博文,存在两个问题&…

【AI】AI和医疗大数据(3/3)

目录 六、AI和医疗大数据的结合案例——基于卷积神经网络CT图像检测 ——步骤: ——技术: ——案例: ——典型应用步骤详解: 第一步:数据预处理 第二步:训练集构建 第三步:预测 第四&a…

Serverless无服务

软件工程的本质复杂度和次要复杂度 本质:如何从抽象的问题,发展出具体的概念上的解决方案(业务问题) 次要:指实现它的过程(技术手段) 过去解决了的次要复杂度(提升研发效率&#…

代币中的decimal精度代表了什么

精度的意义在于允许发送小数的代币。举例,一个CAT代币合约的精度为6。那么 你拥有1个CAT就意味着合约中的balance 1 * 10^6 , 转账 0.1CAT出去的话,就需要输入 0.1*10^6 10^5。 也就时在涉及代币时,查询到的余额、转账的代币数量 都和 代币…

用通俗易懂的方式讲解大模型分布式训练并行技术:MOE并行

前面的文章中讲述了数据并行、流水线并行、张量并行、序列并行、自动并行等多种并行技术。但现在的模型越来越大,训练样本越来越多,每个样本都需要经过模型的全部计算,这就导致了训练成本的平方级增长。 而当我们希望在牺牲极少的计算效率的…

使用numpy处理图片——90度旋转

在《使用numpy处理图片——镜像翻转和旋转》一文中,我们介绍了如何将图片旋转的方法。本文将使用更简单的方法旋转图片90度。 左旋转90度 import numpy as np import PIL.Image as Imagedata np.array(Image.open(the_starry_night.jpg))# left 90 rot90LeftWith…

电子学会C/C++编程等级考试2020年12月(二级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 时间限制:1000 内存限制:65536 输入 输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n…

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导 文章目录 鸿蒙HarmonyOS兼容JS的类Web开发-开发指导常用组件开发指导list开发指导创建list组件添加滚动条添加侧边索引栏实现列表折叠和展开场景示例 dialog开发指导创建dialog组件设置弹窗响应场景示例 form开发指导创建form组件实现…

一个完整的流程表单流转

1.写在前面 一个完整的流程表单审批&#xff08;起表单-->各环节审批-->回退-->重新审批-->完成&#xff09;&#xff0c;前端由Vue2jsElement UI升级为Vue3tsElement Plus&#xff0c;后端流程框架使用Flowable&#xff0c;项目参考了ruoyi-vue-pro(https://gite…

使用python读取yaml文件数据

使用python读取yaml文件&#xff1a; yaml文件数据&#xff1a;data.yaml login_data:url: http://www.baidu.comcase1:user1: password1: 12345errorText: 请输入用户名case2:user2: adminpassword2: errorText: 请输入密码case3:user3: adminpassword3: 123456errorText: 登…

视频监控设备通过onvif协议接入到视频监控平台

目 录 一、什么是onvif规范 1、onvif的定义 2、onvif的优势 二、AS-V1000监控平台对onvif的支持程度 二、通过onvif接入视频监控设备 1、onvif维护主页面 2、设备发现 3、设备验证 4、设备录入系统 5、通道配置 6、权限分配 三、对onvif设备进行…

【设计模式-6】建造者模式的实现与框架中的应用

建造者模式又被成为生成器模式&#xff0c;是一种使用频率比较低&#xff0c;相对复杂的创建型模式&#xff0c;在很多源码框架中可以看到建造者的使用场景&#xff0c;稍后我们会在本文末尾展示几个框架的使用案例。  建造者模式所构造的对象通常是比较复杂而且庞大的&#x…

C++ n皇后问题 || 深度优先搜索模版题

n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n 。 …

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码 HttpClient、HttpURLConnection、OkHttpClient区别切换HttpClient 源码分析总结切换HttpClient源码验证切换是否成功okHttpClient 切换源码分析总结 okHttpClient 切换源码同时开启 okHttp 与httpClient 会…