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

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

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

isolated_download_manager_flutter 是一个用于在Flutter中异步下载文件的插件。它通过隔离(isolate)来处理下载任务,以避免阻塞主线程,从而提高应用的性能和响应速度。

预览

Flutter Download Manager - iPhone 14 Pro Max

开始使用

首先,在 pubspec.yaml 文件中添加 isolated_download_manager_flutter 插件:

dependencies:
  flutter:
    sdk: flutter
  isolated_download_manager_flutter: ^latest_version

请确保将 ^latest_version 替换为最新的版本号,可以从 pub.dev 获取。

使用方法

该插件提供了两个主要的小部件:DownloadWidgetDownloadUrlWidget

DownloadWidget

用于表示 DownloadRequest 对象的状态。

DownloadWidget(
  request: request, 
  builder: (context, state, progress, error) {
    // UI goes here 
  }
)

完整示例代码可以参考 GitHub 示例

DownloadUrlWidget

简化版,其中 DownloadRequest 内部存储(通过构建器访问)。

DownloadUrlWidget(
  url: url, 
  path: path, 
  controller: controller, // optional
  builder: (context, controller, state, progress, error, request) {
    // UI goes here 
  }
);

控制器允许在小部件构建器体外访问任务。 完整示例代码可以参考 GitHub 示例

功能丰富的示例可以在 复杂示例目录 中找到。

完整示例Demo

以下是一个完整的示例应用程序,演示如何使用 DownloadWidget 来下载文件并显示进度。

import 'package:flutter/material.dart';
import 'package:isolated_download_manager_flutter/isolated_download_manager_flutter.dart';
import 'package:isolated_download_manager/isolated_download_manager.dart';
import 'dart:io' show File;

void main() {
  runApp(const ExampleApp());
}

class ExampleApp extends StatefulWidget {
  const ExampleApp({Key? key}) : super(key: key);

  @override
  State<ExampleApp> createState() => _ExampleAppState();
}

class _ExampleAppState extends State<ExampleApp> {
  static const String url =
      "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
  static const String path = "./BigBuckBunny.mp4";

  DownloadRequest? _request;

  @override
  void initState() {
    super.initState();
    DownloadManager.instance.init(isolates: 2);
  }

  @override
  void dispose() {
    DownloadManager.instance.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(
              title: const Text("DownloadWidget"),
              actions: [
                IconButton(
                    onPressed: _reset,
                    icon: const Icon(Icons.replay_rounded))
              ],
            ),
            body: Center(
                child: DownloadWidget(
                    request: _request,
                    builder: (context, state, progress, error) {
                      switch (state) {
                        case DownloadWidgetState.initial:
                          return IconButton(
                              onPressed: _download,
                              icon: const Icon(Icons.download_rounded));
                        case DownloadWidgetState.queued:
                        case DownloadWidgetState.downloading:
                          return Stack(alignment: Alignment.center, children: [
                            CircularProgressIndicator(
                                value: 1.0,
                                color: Colors.grey.withOpacity(0.2)),
                            CircularProgressIndicator(value: progress),
                            IconButton(
                                onPressed: _cancel,
                                icon: const Icon(Icons.close_rounded)),
                          ]);
                        case DownloadWidgetState.failed:
                          return IconButton(
                              onPressed: _download,
                              icon: const Icon(Icons.restart_alt_rounded));
                        case DownloadWidgetState.downloaded:
                          return const Icon(Icons.done_rounded);
                        default:
                          return const SizedBox();
                      }
                    }))));
  }

  void _download() {
    setState(() =>
        _request = DownloadManager.instance.download(url, path: path));
  }

  void _cancel() {
    _request?.cancel();
  }

  void _reset() async {
    _cancel();
    setState(() => _request = null);
    final file = File(path);
    if (await file.exists()) await file.delete();
  }
}

此示例展示了如何初始化下载管理器、下载文件、取消下载以及重置下载状态。希望这个示例能帮助你理解如何在你的Flutter应用中使用 isolated_download_manager_flutter 插件。


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

1 回复

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


当然,以下是一个关于如何使用 isolated_download_manager_flutter 插件进行文件下载管理的代码示例。这个插件允许你在 Flutter 应用中实现后台文件下载功能,并且不会阻塞主 UI 线程。

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

dependencies:
  flutter:
    sdk: flutter
  isolated_download_manager_flutter: ^最新版本号  # 请替换为最新版本号

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

接下来,在你的 Flutter 项目中,你可以按照以下步骤实现文件下载功能:

  1. 初始化 DownloadManager

    在你的主文件(如 main.dart)或任何合适的地方初始化 DownloadManager

import 'package:flutter/material.dart';
import 'package:isolated_download_manager_flutter/isolated_download_manager_flutter.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> {
  late DownloadManager downloadManager;

  @override
  void initState() {
    super.initState();
    downloadManager = DownloadManager();
    downloadManager.init();  // 初始化 DownloadManager
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('文件下载管理'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _startDownload();
          },
          child: Text('开始下载'),
        ),
      ),
    );
  }

  void _startDownload() async {
    String url = 'https://example.com/file.zip';  // 替换为你要下载的文件URL
    String fileName = 'file.zip';  // 下载后的文件名
    String storagePath = '/storage/emulated/0/Download/';  // 下载存储路径

    DownloadTask task = DownloadTask(
      url: url,
      fileName: fileName,
      storagePath: storagePath,
    );

    try {
      DownloadTaskStatus status = await downloadManager.start(task);
      print('Download Status: $status');
    } catch (e) {
      print('Error: $e');
    }
  }
}
  1. 处理下载状态

    你可能需要监听下载的状态,比如进度、完成或错误。你可以通过注册一个回调来处理这些状态。

class _DownloadPageState extends State<DownloadPage> {
  late DownloadManager downloadManager;
  DownloadTaskStatus? _downloadStatus;

  @override
  void initState() {
    super.initState();
    downloadManager = DownloadManager();
    downloadManager.init();

    // 注册下载状态回调
    downloadManager.addListener((DownloadTaskStatus status) {
      setState(() {
        _downloadStatus = status;
      });
      print('Download Status Updated: $status');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('文件下载管理'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                _startDownload();
              },
              child: Text('开始下载'),
            ),
            if (_downloadStatus != null)
              Text('Download Status: ${_downloadStatus!.message}'),
          ],
        ),
      ),
    );
  }

  void _startDownload() async {
    String url = 'https://example.com/file.zip';
    String fileName = 'file.zip';
    String storagePath = '/storage/emulated/0/Download/';

    DownloadTask task = DownloadTask(
      url: url,
      fileName: fileName,
      storagePath: storagePath,
    );

    try {
      DownloadTaskStatus status = await downloadManager.start(task);
      print('Download Status: $status');
    } catch (e) {
      print('Error: $e');
    }
  }

  @override
  void dispose() {
    downloadManager.dispose();  // 释放资源
    super.dispose();
  }
}

以上代码展示了如何使用 isolated_download_manager_flutter 插件进行文件下载管理,包括初始化 DownloadManager、开始下载以及监听下载状态。请确保你已经添加了必要的权限,比如存储权限,到你的 AndroidManifest.xml 文件中,并根据需要调整存储路径和文件URL。

回到顶部