如何使用 Flutter 下载文件并将其存储在 Downloads 文件夹中

2024-03-05

我正在使用 Flutter 1.10.3 构建一个应用程序,但将图像下载到设备的下载文件夹时遇到困难。

是否可以选择在不使用任何第三部分库的情况下执行此操作?


添加一些必需的依赖项,我有一个仅适用于 android 的测试演示。请查阅file_utils and path_provider当你在IOS设备中实现时。

  dio: ^3.0.0

  path_provider: ^1.3.0

  simple_permissions: ^0.1.9

  file_utils: ^0.1.3

Note: simple_permissions已断开连接,请使用此依赖项permission_handler

您需要在 android 清单文件上添加权限。

  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

示例代码:

  import 'dart:io';
  import 'package:flutter/material.dart';
  import 'package:dio/dio.dart';
  import 'package:path_provider/path_provider.dart';
  import 'dart:async';
  import 'package:simple_permissions/simple_permissions.dart';
  import 'package:file_utils/file_utils.dart';
  import 'dart:math';

  void main() => runApp(Downloader());

  class Downloader extends StatelessWidget {
    @override
    Widget build(BuildContext context) => MaterialApp(
          title: "File Downloader",
          debugShowCheckedModeBanner: false,
          home: FileDownloader(),
          theme: ThemeData(primarySwatch: Colors.blue),
        );
  }

  class FileDownloader extends StatefulWidget {
    @override
    _FileDownloaderState createState() => _FileDownloaderState();
  }

  class _FileDownloaderState extends State<FileDownloader> {

    final imgUrl = "https://images6.alphacoders.com/683/thumb-1920-683023.jpg";
    bool downloading = false;
    var progress = "";
    var path = "No Data";
    var platformVersion = "Unknown";
    Permission permission1 = Permission.WriteExternalStorage;
    var _onPressed;
    static final Random random = Random();
    Directory externalDir;

    @override
    void initState() {
      super.initState();
      downloadFile();
    }


    Future<void> downloadFile() async {
      Dio dio = Dio();
      bool checkPermission1 =
          await SimplePermissions.checkPermission(permission1);
      // print(checkPermission1);
      if (checkPermission1 == false) {
        await SimplePermissions.requestPermission(permission1);
        checkPermission1 = await SimplePermissions.checkPermission(permission1);
      }
      if (checkPermission1 == true) {
        String dirloc = "";
        if (Platform.isAndroid) {
          dirloc = "/sdcard/download/";
        } else {
          dirloc = (await getApplicationDocumentsDirectory()).path;
        }

        var randid = random.nextInt(10000);

        try {
          FileUtils.mkdir([dirloc]);
          await dio.download(imgUrl, dirloc + randid.toString() + ".jpg",
              onReceiveProgress: (receivedBytes, totalBytes) {
            setState(() {
              downloading = true;
              progress =
                  ((receivedBytes / totalBytes) * 100).toStringAsFixed(0) + "%";
            });
          });
        } catch (e) {
          print(e);
        }

        setState(() {
          downloading = false;
          progress = "Download Completed.";
          path = dirloc + randid.toString() + ".jpg";
        });
      } else {
        setState(() {
          progress = "Permission Denied!";
          _onPressed = () {
            downloadFile();
          };
        });
      }
    }

    @override
    Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          title: Text('File Downloader'),
        ),
        body: Center(
            child: downloading
                ? Container(
                    height: 120.0,
                    width: 200.0,
                    child: Card(
                      color: Colors.black,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          CircularProgressIndicator(),
                          SizedBox(
                            height: 10.0,
                          ),
                          Text(
                            'Downloading File: $progress',
                            style: TextStyle(color: Colors.white),
                          ),
                        ],
                      ),
                    ),
                  )
                : Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Text(path),
                      MaterialButton(
                        child: Text('Request Permission Again.'),
                        onPressed: _onPressed,
                        disabledColor: Colors.blueGrey,
                        color: Colors.pink,
                        textColor: Colors.white,
                        height: 40.0,
                        minWidth: 100.0,
                      ),
                    ],
                  )));
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Flutter 下载文件并将其存储在 Downloads 文件夹中 的相关文章

随机推荐

  • 让 GCC 优化手工组装

    试图让 GCC 不会每次生成加载 修改 存储操作 or 我定义了以下宏 define bset base offset mask bmanip set base offset mask define bclr base offset mas
  • Spring security 自定义身份验证过滤器,无需 web.xml

    使用注释和java配置 我不太清楚如何为spring security注册一个覆盖的过滤器 我想要实现的是自动登录而不显示登录表单 因为那时用户已经通过身份验证 因此 只会读取标头参数并使用 spring security 进行授权 这是我
  • 可以保留 ASIHTTPRequest 委托吗?

    保留子类的委托可以吗ASIHTTPRequest 我做了一个子类ASIHTTPRequest called JSONRequest 每个实例JSONRequest是它自己的委托 处理回调 并将它们传递给jsonDelegate 这是一个私有
  • 如何动态设置 JPA 标准查询的位置/命名参数?

    Hibernate 提供程序不会生成准备好的语句非字符串类型参数 除非它们设置为entityManager createQuery criteriaQuery setParameter Parameter p T t 默认情况下 如 Ecl
  • 在运行时绑定时,WPF UserControl 不会填充父容器

    我有一个带有 StackPanel 的窗口 并且 StackPanel 有一个 ContentControl 它在运行时获取绑定到它的 UserControl 在 MainWindow xaml 中
  • 测试 Mongoose Node.JS 应用程序

    我正在尝试为我的 Node 应用程序的部分内容编写单元测试 我正在使用 Mongoose 作为我的 ORM 我搜索了很多关于如何使用 Mongoose 和 Node 进行测试的信息 但没有找到任何内容 这些解决方案 框架似乎都是全栈的 或者
  • 使用 Jenkins 进行 Azure 配置

    作为 QA 管道 在 Jenkins 中 的一部分 目标是自动配置和配置虚拟机以运行 QA 测试 Jenkins 管道可以触发 Terraform 代码来自动配置 VM 和用于配置 VM 的 Ansible 代码 但是 诸如此类的问题rol
  • 使用 canvaskit 进行 Flutter Web 构建:无法加载 Image.network()

    I can t use the image URL from my domain but I can use the image URL from another domain like Facebook The error is 当将 S
  • 如何从 MySQL 表中的多个列中获取指定最小长度的所有不同单词?

    在 MySQL 5 6 数据库中我有表tablename其中有 包括其他 三个TEXT列 col a col b col c 我想从这三列中提取所有至少 5 个字符长的唯一单词 单词之间用空格分隔 我所说的 单词 是指任何非空格字符的字符串
  • 在故事板中重用 uiview xib

    我通常喜欢在界面生成器中创建和设计我的 uiview 有时我需要在 xib 中创建单个视图 该视图可以在故事板的多个视图控制器中重用 在故事板中重用并渲染 xib 使用 Swift 2 2 和 Xcode 7 3 1 进行测试 1 创建一个
  • 在 .NET 中打开 pdf

    在我们正在开发的应用程序中 我们正在尝试实现帮助 我们有一个 pdf 帮助文档 目前认为当用户单击帮助按钮时仅打开 pdf 是可以接受的 该应用程序是一个桌面应用程序 pdf 文件需要以某种方式包含在安装中并安装在本地计算机上 我本质上需要
  • Lua 注册表与轻用户数据和引用有什么区别?

    因此 使用 Lua C API 您可以在注册表中保存 Lua 值并在以后检索它 有不同的方法可以做到这一点 您可以创建一个变量并使用它的指针作为注册表中的键 因为它始终是唯一的 您可以将指针作为轻用户数据推送 您还可以使用创建参考LuaL
  • Azure Sql 中的 Active Directory(AD) 身份验证不起作用

    我正在尝试让 Azure AD 身份验证针对我的 Azure SQL 数据库工作 我创建了一个 PaaS 数据库及其关联的 PaaS Sql Server 我将我的 Azure AD 帐户分配为 PaaS Sql Server 的 Acti
  • 在 iOS 上估计到 iBeacon 的距离

    我正在尝试估计从 iOS 设备到 iBeacon 的距离 我知道距离估计不是非常准确 而且我也知道这个公式 https electronics stackexchange com questions 83354 calculate dist
  • 我的数据触发绑定有什么问题?

    我创建了一个附加属性来扩展具有附加状态的 Button 类
  • HttpSession request.getSession(false)

    我有个问题 在我的servlet在 glassfish 中我称之为方法request getSession false 它应该return null 但相反 总是有一个session回 而且 如果我invalidate the sessio
  • docker构建发布插件出错

    你能帮我配置一下吗jenkins docker 构建发布插件 https wiki jenkins ci org display JENKINS Docker build publish Plugin 我已经为 docker repo 设置
  • ImageIO.read(getClass().getResourceAsStream (input==NULL) 出现错误?

    当我使用以下代码时 我不断收到此错误 try image ImageIO read getClass getResourceAsStream build classes javaproject Space gif catch IOExcep
  • int 变量的大小

    int的大小是如何决定的 int 的大小是否真的取决于处理器 对于 32 位机器 它是 32 位 对于 16 位机器 它是 16 在我的机器上 它显示为 32 位 尽管该机器安装了 64 位处理器和 64 位 Ubuntu 这取决于实施 C
  • 如何使用 Flutter 下载文件并将其存储在 Downloads 文件夹中

    我正在使用 Flutter 1 10 3 构建一个应用程序 但将图像下载到设备的下载文件夹时遇到困难 是否可以选择在不使用任何第三部分库的情况下执行此操作 添加一些必需的依赖项 我有一个仅适用于 android 的测试演示 请查阅file