Flutter文件下载管理插件download_task的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter文件下载管理插件download_task的使用

Features

  • Resumable HTTP download request - pause, resume, cancel, 实时进度和错误处理
    • Take control - 可以暂停,恢复和取消下载任务
    • Listen to updates - 实时监听下载进度和失败处理
    • Pure Dart - 仅依赖http
    • Easy to use - 单例模式和流式操作,易于使用

Getting started

pubspec.yaml中添加来自pub.dev的最新版本并运行:

dependencies:
  download_task: ^latest_version # 替换为实际的最新版本号

然后,在命令行执行:

flutter pub get

Usage 示例代码

下面是一个完整的示例,展示了如何使用download_task来下载文件、监听下载状态以及控制下载过程(暂停、恢复、取消)。

示例:完整源代码

import 'package:download_task/download_task.dart';
import 'dart:io' show File, Directory;

void main() async {
  // 指定URL和目标路径
  final url = Uri.parse("https://golang.org/dl/go1.19.1.src.tar.gz");
  final file = File("${Directory.current.path}/example/Go.tar.gz");

  // 初始化下载请求
  final task = await DownloadTask.download(url, file: file);

  // 监听状态变化
  double previousProgress = 0.0;
  task.events.listen((event) {
    switch (event.state) {
      case TaskState.downloading:
        final bytesReceived = event.bytesReceived!;
        final totalBytes = event.totalBytes!;
        if (totalBytes == -1) return;

        final progress = (bytesReceived / totalBytes * 100).floorToDouble();
        if (progress != previousProgress && progress % 10 == 0) {
          print("progress $progress%");
          previousProgress = progress;
        }
        break;
      case TaskState.paused:
        print("paused");
        break;
      case TaskState.success:
        print("downloaded");
        break;
      case TaskState.canceled:
        print("canceled");
        break;
      case TaskState.error:
        print("error: ${event.error!}");
        break;
    }
  });

  // 控制下载过程
  await Future.delayed(const Duration(milliseconds: 500));
  task.pause();
  await Future.delayed(const Duration(milliseconds: 500));
  task.resume();
  await Future.delayed(const Duration(milliseconds: 1500));
  task.cancel();
}

此示例代码首先指定了一个下载链接和保存位置,然后初始化了一个下载任务。通过监听task.events可以实时获取下载状态的变化,包括下载进度、暂停、成功完成、取消或出现错误等,并对这些状态进行了简单的打印输出。此外,还演示了如何在下载过程中暂停、恢复和取消下载任务。

Additional information

此包主要用于配合isolated_download_manager一起使用,如果您有更复杂的需求,比如后台下载或者多线程下载,可以考虑使用该库。

希望这个回答能帮助您更好地理解和使用download_task插件!如果有任何问题,请随时提问。


更多关于Flutter文件下载管理插件download_task的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件下载管理插件download_task的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于在Flutter中使用download_task插件进行文件下载管理,以下是一个简单的代码示例,展示了如何使用该插件进行文件下载。

首先,确保你已经在pubspec.yaml文件中添加了download_task依赖:

dependencies:
  flutter:
    sdk: flutter
  download_task: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来获取依赖。

以下是一个完整的示例,展示了如何使用download_task插件来下载文件并管理下载任务:

import 'package:flutter/material.dart';
import 'package:download_task/download_task.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Download Task Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DownloadDemo(),
    );
  }
}

class DownloadDemo extends StatefulWidget {
  @override
  _DownloadDemoState createState() => _DownloadDemoState();
}

class _DownloadDemoState extends State<DownloadDemo> {
  DownloadTask? _downloadTask;
  String _downloadStatus = "No download started";
  double _progress = 0.0;

  @override
  void initState() {
    super.initState();
    // Initialize DownloadTask
    _downloadTask = DownloadTask(
      directory: Directory(Directory.systemTemp.path), // Specify the download directory
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Download Task Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Download Status: $_downloadStatus',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            LinearProgressIndicator(
              value: _progress,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // URL of the file to download
                String url = "https://example.com/path/to/your/file.zip";
                
                // Start the download
                var result = await _downloadTask!.start(
                  taskId: "fileDownload",
                  url: url,
                  fileName: "file.zip",
                  saveDir: Directory(Directory.systemTemp.path),
                  showNotification: true,
                  openFileFromNotification: true,
                );

                if (result.status == DownloadTaskStatus.completed) {
                  setState(() {
                    _downloadStatus = "Download completed!";
                    _progress = 1.0;
                  });
                } else if (result.status == DownloadTaskStatus.progress) {
                  setState(() {
                    _downloadStatus = "Downloading...";
                    _progress = result.progress;
                  });
                } else if (result.status == DownloadTaskStatus.paused) {
                  setState(() {
                    _downloadStatus = "Download paused.";
                  });
                } else if (result.status == DownloadTaskStatus.error) {
                  setState(() {
                    _downloadStatus = "Download error: ${result.errorMessage}";
                  });
                }
              },
              child: Text('Start Download'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // Cancel all ongoing downloads when the widget is disposed
    _downloadTask?.cancelAll();
    super.dispose();
  }
}

说明

  1. 依赖配置:在pubspec.yaml文件中添加download_task依赖。
  2. 初始化:在initState方法中初始化DownloadTask实例,并指定下载目录。
  3. 下载按钮:在UI中添加一个按钮,点击按钮时调用_downloadTask.start()方法开始下载。
  4. 下载状态更新:根据下载结果更新UI中的下载状态和进度。
  5. 资源释放:在dispose方法中调用_downloadTask.cancelAll()取消所有未完成的下载任务。

这个示例展示了如何使用download_task插件来下载文件,并实时更新下载状态和进度。你可以根据实际需求进一步扩展和优化这个示例。

回到顶部