Flutter文件多任务下载插件multi_downloader2的使用

Flutter文件多任务下载插件multi_downloader2的使用


简介

multi_downloader2 是一个用于创建和管理下载任务的 Flutter 插件。它支持 iOS 和 Android 平台,并且能够在后台模式下运行下载任务。

  • 平台支持: Flutter、Android、iOS
  • 依赖库: 在 Android 上基于 WorkManager,在 iOS 上基于 NSURLSessionDownloadTask

iOS 集成

必要配置

启用后台模式

打开你的 ios 项目并启用后台模式:

添加 SQLite 库

添加 sqlite 库到项目中:

配置 AppDelegate

在 Objective-C 或 Swift 中配置 AppDelegate

Objective-C

// AppDelegate.h
#import <Flutter/Flutter.h>
#import <UIKit/UIKit.h>

@interface AppDelegate : FlutterAppDelegate

@end

// AppDelegate.m
#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#include "FlutterDownloaderPlugin.h"

@implementation AppDelegate

void registerPlugins(NSObject<FlutterPluginRegistry>* registry) {   
  if (![registry hasPlugin:@"FlutterDownloaderPlugin"]) {
     [FlutterDownloaderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterDownloaderPlugin"]];
  }
}

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GeneratedPluginRegistrant registerWithRegistry:self];
  [FlutterDownloaderPlugin setPluginRegistrantCallback:registerPlugins];
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

@end

Swift

import UIKit
import Flutter
import multi_downloader

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

private func registerPlugins(registry: FlutterPluginRegistry) { 
    if (!registry.hasPlugin("FlutterDownloaderPlugin")) {
       FlutterDownloaderPlugin.register(with: registry.registrar(forPlugin: "FlutterDownloaderPlugin"))
    }
}

可选配置

支持 HTTP 请求

如果需要通过 HTTP 下载文件,则需要禁用 Apple Transport Security (ATS) 特性。有两种方式:

  1. 禁用特定域的 ATSInfo.plist 文件中添加以下代码:

    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSExceptionDomains</key>
      <dict>
        <key>www.yourserver.com</key>
        <dict>
          <!-- 允许子域 -->
          <key>NSIncludesSubdomains</key>
          <true/>
          <!-- 允许标准 HTTP 请求 -->
          <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
          <true/>
          <!-- 指定最低 TLS 版本 -->
          <key>NSTemporaryExceptionMinimumTLSVersion</key>
          <string>TLSv1.1</string>
        </dict>
      </dict>
    </dict>
    
  2. 完全禁用 ATSInfo.plist 文件中添加以下代码:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    

配置最大并发任务数

默认情况下,该插件允许同时运行 3 个下载任务。可以通过以下代码更改此限制:

<!-- 更改此数字以配置最大并发任务数 -->
<key>FDMaximumConcurrentTasks</key>
<integer>5</integer>

本地化通知消息

可以自定义下载完成时的通知消息。例如:

<key>FDAllFilesDownloadedMessage</key>
<string>所有文件已下载</string>

Android 集成

必要配置

配置 AndroidManifest.xml

确保添加以下代码以处理点击通知后打开文件的功能:

<provider
    android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
    android:authorities="${applicationId}.multi_downloader.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

配置权限

确保添加以下权限:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

可选配置

配置最大并发任务数

可以通过以下代码设置最大并发任务数:

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    android:enabled="false"
    android:exported="false" />

<provider
    android:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer"
    android:authorities="${applicationId}.flutter-downloader-init"
    android:exported="false">
    <!-- 更改此数字以配置最大并发任务数 -->
    <meta-data
        android:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS"
        android:value="5" />
</provider>

本地化通知消息

可以自定义通知消息,例如:

<string name="multi_downloader_notification_started">下载开始</string>
<string name="multi_downloader_notification_in_progress">下载中</string>
<string name="multi_downloader_notification_canceled">下载取消</string>
<string name="multi_downloader_notification_failed">下载失败</string>
<string name="multi_downloader_notification_complete">下载完成</string>
<string name="multi_downloader_notification_paused">下载暂停</string>

使用示例

导入包

import 'package:multi_downloader/multi_downloader.dart';

初始化插件

WidgetsFlutterBinding.ensureInitialized();
await FlutterDownloader.initialize();

创建新下载任务

final taskId = await FlutterDownloader.enqueue(
  url: 'your download link', // 下载链接
  savedDir: 'the path of directory where you want to save downloaded files', // 保存路径
  showNotification: true, // 是否在状态栏显示下载进度(仅限 Android)
  openFileFromNotification: true, // 点击通知是否打开下载文件(仅限 Android)
);

更新下载进度

FlutterDownloader.registerCallback(callback); // 注册回调函数

// 回调函数示例
static void downloadCallback(String id, DownloadTaskStatus status, int progress) {
  final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port');
  send.send([id, status, progress]);
}

加载所有任务

final tasks = await FlutterDownloader.loadTasks();

取消任务

FlutterDownloader.cancel(taskId: taskId); // 取消单个任务
FlutterDownloader.cancelAll(); // 取消所有任务

暂停任务

FlutterDownloader.pause(taskId: taskId);

恢复任务

FlutterDownloader.resume(taskId: taskId);

重试失败的任务

FlutterDownloader.retry(taskId: taskId);

删除任务

FlutterDownloader.remove(taskId: taskId, shouldDeleteContent: false);

打开下载的文件

FlutterDownloader.open(taskId: taskId);

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

1 回复

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


multi_downloader2 是一个用于 Flutter 的多任务下载插件,支持同时下载多个文件,并且提供了进度回调、暂停、恢复等功能。以下是如何在 Flutter 项目中使用 multi_downloader2 插件的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 multi_downloader2 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  multi_downloader2: ^0.0.1  # 请确保使用最新版本

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

2. 初始化下载器

在你的 Dart 文件中,首先导入 multi_downloader2 插件:

import 'package:multi_downloader2/multi_downloader2.dart';

然后初始化下载器:

void initDownloader() async {
  await MultiDownloader2.initialize();
}

3. 下载文件

使用 MultiDownloader2.download 方法来下载文件。你需要提供文件的 URL 和保存路径。

void downloadFile(String url, String savePath) async {
  String taskId = await MultiDownloader2.download(
    url,
    savePath,
    onProgress: (progress) {
      print('下载进度: $progress%');
    },
    onCompleted: () {
      print('下载完成');
    },
    onError: (error) {
      print('下载出错: $error');
    },
  );

  print('任务ID: $taskId');
}

4. 暂停和恢复下载

你可以使用任务 ID 来暂停和恢复下载。

void pauseDownload(String taskId) async {
  await MultiDownloader2.pause(taskId);
}

void resumeDownload(String taskId) async {
  await MultiDownloader2.resume(taskId);
}

5. 取消下载

如果你想取消下载,可以使用 cancel 方法。

void cancelDownload(String taskId) async {
  await MultiDownloader2.cancel(taskId);
}

6. 获取下载状态

你可以使用 getStatus 方法来获取下载任务的状态。

void getDownloadStatus(String taskId) async {
  DownloadStatus status = await MultiDownloader2.getStatus(taskId);
  print('下载状态: $status');
}

7. 示例代码

以下是一个完整的示例代码,展示了如何使用 multi_downloader2 插件进行多任务下载:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DownloadScreen(),
    );
  }
}

class DownloadScreen extends StatefulWidget {
  [@override](/user/override)
  _DownloadScreenState createState() => _DownloadScreenState();
}

class _DownloadScreenState extends State<DownloadScreen> {
  String taskId;

  [@override](/user/override)
  void initState() {
    super.initState();
    initDownloader();
  }

  void initDownloader() async {
    await MultiDownloader2.initialize();
  }

  void downloadFile(String url, String savePath) async {
    taskId = await MultiDownloader2.download(
      url,
      savePath,
      onProgress: (progress) {
        print('下载进度: $progress%');
      },
      onCompleted: () {
        print('下载完成');
      },
      onError: (error) {
        print('下载出错: $error');
      },
    );

    print('任务ID: $taskId');
  }

  void pauseDownload() async {
    if (taskId != null) {
      await MultiDownloader2.pause(taskId);
    }
  }

  void resumeDownload() async {
    if (taskId != null) {
      await MultiDownloader2.resume(taskId);
    }
  }

  void cancelDownload() async {
    if (taskId != null) {
      await MultiDownloader2.cancel(taskId);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('多任务下载示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => downloadFile(
                'https://example.com/file1.zip',
                '/storage/emulated/0/Download/file1.zip',
              ),
              child: Text('开始下载'),
            ),
            ElevatedButton(
              onPressed: pauseDownload,
              child: Text('暂停下载'),
            ),
            ElevatedButton(
              onPressed: resumeDownload,
              child: Text('恢复下载'),
            ),
            ElevatedButton(
              onPressed: cancelDownload,
              child: Text('取消下载'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部