Flutter独立下载管理插件isolated_download_manager的使用

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

Flutter独立下载管理插件isolated_download_manager的使用

插件简介

isolated_download_manager 是一个基于可重用隔离区(isolate)实现的文件下载管理器,它具有进度、取消、暂停和恢复等功能。以下是该插件的主要特性:

  • 完全隔离:可以创建任意数量的可重用隔离区,所有隔离区都在内部处理。
  • 功能强大:支持暂停、恢复、取消、下载队列等众多功能。
  • 监听更新:实时处理进度和失败事件。
  • UI组件:提供可以直接使用的Flutter小部件(可选通过 isolated_download_manager_flutter 包引入)。
  • 纯Dart实现:仅依赖 http 包。

开始使用

添加依赖

在你的 pubspec.yaml 文件中添加最新版本的 isolated_download_manager 依赖:

dependencies:
  isolated_download_manager: ^latest_version

请确保替换 ^latest_version 为从 pub.dev 获取的实际版本号。

初始化

在应用启动时初始化下载管理器,指定要创建的隔离区数量:

await DownloadManager.instance.init(isolates: 3);

使用示例

下面是一个完整的示例代码,展示了如何使用 isolated_download_manager 进行文件下载,并处理下载过程中的各种事件:

import 'dart:io' show exit;
import 'package:isolated_download_manager/isolated_download_manager.dart';

void main() async {
  // Initialize
  await DownloadManager.instance.init(
    isolates: 3,
  );

  // Download
  final request = DownloadManager.instance
      .download("https://golang.org/dl/go1.19.1.src.tar.gz", path: "Go.tar.gz");

  // Listen to events
  request.events.listen((event) {
    if (event is DownloadState) {
      print("event: $event");
      if (event == DownloadState.finished) dispose();
    } else if (event is double) {
      print("progress: ${(event * 100.0).toStringAsFixed(0)}%");
    }
  }, onError: (error) {
    print("error $error");
    dispose();
  });

  // Control the task
  await Future.delayed(const Duration(milliseconds: 1500));
  request.pause();
  await Future.delayed(const Duration(milliseconds: 1500));
  request.resume();
  await Future.delayed(const Duration(milliseconds: 1500));
  request.cancel();

  // Access properties
  print(request.progress);
  print(request.isPaused);
  print(request.isCancelled);

  // Static methods
  print(DownloadManager.instance.queue); // list queued requests
  DownloadManager.instance.cancelAll(); // cancel all downloads
}

// Clean-up isolates and exit
void dispose() => DownloadManager.instance.dispose().then((_) => exit(0));

示例说明

  1. 初始化:调用 DownloadManager.instance.init 方法来初始化下载管理器,并设置隔离区的数量。
  2. 下载文件:使用 DownloadManager.instance.download 方法发起下载请求,并指定下载链接和保存路径。
  3. 监听事件:通过 request.events.listen 监听下载状态变化和进度更新。当下载完成或发生错误时,调用 dispose 方法清理资源并退出程序。
  4. 控制任务:演示了如何暂停、恢复和取消下载任务。
  5. 访问属性:打印下载任务的当前进度、是否已暂停以及是否已取消。
  6. 静态方法:展示了如何获取下载队列和取消所有下载任务。

其他信息

对于可恢复的下载,isolated_download_manager 使用了 download_task 包。如果你需要更复杂的下载管理功能,可以考虑结合这两个包一起使用。

更多详细信息和高级用法,请参考 官方GitHub仓库Pub.dev页面


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用isolated_download_manager插件进行独立下载管理的代码示例。这个插件允许你在Flutter应用中执行后台下载操作,而不阻塞主UI线程。

首先,确保你的Flutter项目中已经添加了isolated_download_manager依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  isolated_download_manager: ^最新版本号  # 请替换为实际发布的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中如下使用isolated_download_manager

import 'package:flutter/material.dart';
import 'package:isolated_download_manager/isolated_download_manager.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DownloadPage(),
    );
  }
}

class DownloadPage extends StatefulWidget {
  @override
  _DownloadPageState createState() => _DownloadPageState();
}

class _DownloadPageState extends State<DownloadPage> {
  final DownloadManager _downloadManager = DownloadManager();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Download Manager Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _startDownload,
              child: Text('Start Download'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _cancelDownload,
              child: Text('Cancel Download'),
            ),
          ],
        ),
      ),
    );
  }

  void _startDownload() async {
    final downloadTaskId = await _downloadManager.startDownload(
      url: 'https://example.com/largefile.zip', // 替换为实际的下载URL
      storagePath: '/storage/emulated/0/Download/', // 存储路径,确保应用有写入权限
      fileName: 'largefile.zip',
    );

    print('Download started with taskId: $downloadTaskId');

    // 监听下载进度
    _downloadManager.downloadProgress(downloadTaskId).listen((progress) {
      print('Download progress: ${progress.progress}%');
      if (progress.status == DownloadStatus.completed) {
        print('Download completed!');
      } else if (progress.status == DownloadStatus.cancelled) {
        print('Download cancelled!');
      } else if (progress.status == DownloadStatus.error) {
        print('Download error: ${progress.error?.message}');
      }
    });
  }

  void _cancelDownload() async {
    // 假设你已经有一个taskId,这里用一个示例值
    final downloadTaskId = 'exampleTaskId'; // 替换为实际的taskId
    await _downloadManager.cancelDownload(downloadTaskId);
    print('Download cancelled for taskId: $downloadTaskId');
  }
}

注意点:

  1. 权限处理:在实际应用中,你需要处理存储权限。对于Android,你可能需要在AndroidManifest.xml中请求权限,并在运行时请求用户授予权限。对于iOS,你需要在Info.plist中声明必要的权限。

  2. 错误处理:示例代码中没有完整的错误处理逻辑。在实际应用中,你应该添加适当的错误处理来确保应用的健壮性。

  3. 依赖版本:确保使用isolated_download_manager的最新稳定版本。

  4. 多任务下载isolated_download_manager支持多任务下载,你可以根据需要管理多个下载任务。

  5. UI更新:示例中使用了print来输出下载进度。在实际应用中,你可能希望更新UI来显示下载进度。

希望这个示例能帮助你更好地理解如何在Flutter项目中使用isolated_download_manager插件进行独立下载管理。

回到顶部