flutter 文件下载及存储路径

flutter 文件下载及存储路径


前言

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


一、下载进度条

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

dart 复制代码
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来获取文件的路径。

dart 复制代码
    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 中封装好的方法就行

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

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


总结

相关推荐
秋月华星22 分钟前
【flutter】TextField输入框工具栏文本为英文解决(不用安装插件版本
前端·javascript·flutter
程序员老刘·27 分钟前
Flutter开发者 3.29版本关注要点
flutter·跨平台开发·客户端开发
—Qeyser1 小时前
用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏
javascript·游戏·html
千里码aicood1 小时前
[含文档+PPT+源码等]精品基于Python实现的校园小助手小程序的设计与实现
开发语言·前端·python
青红光硫化黑1 小时前
React基础之React.memo
前端·javascript·react.js
大麦大麦1 小时前
深入剖析 Sass:从基础到进阶的 CSS 预处理器应用指南
开发语言·前端·css·面试·rust·uni-app·sass
GDAL2 小时前
better-sqlite3之exec方法
javascript·sqlite
匹马夕阳3 小时前
基于Canvas和和原生JS实现俄罗斯方块小游戏
javascript·canva可画
m0_616188493 小时前
Vue3 中 Computed 用法
前端·javascript·vue.js
六个点3 小时前
图片懒加载与预加载的实现
前端·javascript·面试