flutter_downloader 1.4.0

  • Readme
  • Changelog
  • Example
  • Installing
  • 99

Flutter Community: flutter_downloader

Flutter Downloader #

pub package

用于创建和管理下载任务的插件. 支持iOS和Android.

此插件基于Android中的WorkManager和iOS中的NSURLSessionDownloadTask ,以在后台模式下运行下载任务.

iOS integration #

Required configuration: #

注意:以下步骤需要在Xcode中打开ios项目.

  • 启用后台模式.
  • Add sqlite library.

  • Configure 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) {
  //
  // Integration note:
  //
  // In Flutter, in order to work in background isolate, plugins need to register with
  // a special instance of `FlutterEngine` that serves for background execution only.
  // Hence, all (and only) plugins that require background execution feature need to 
  // call `registerWithRegistrar` in this function. 
  //
  // The default `GeneratedPluginRegistrant` will call `registerWithRegistrar` of all
  // plugins integrated in your application. Hence, if you are using `FlutterDownloaderPlugin`
  // along with other plugins that need UI manipulation, you should register 
  // `FlutterDownloaderPlugin` and any 'background' plugins explicitly like this: 
  //   
  // if (![registry hasPlugin:@"FlutterDownloaderPlugin"]) {
  //    [FlutterDownloaderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterDownloaderPlugin"]];
  // }
  //
  [GeneratedPluginRegistrant registerWithRegistry:registry];
}

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GeneratedPluginRegistrant registerWithRegistry:self];
  [FlutterDownloaderPlugin setPluginRegistrantCallback:registerPlugins];
  // Override point for customization after application launch.
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

@end

或Swift:

import UIKit
import Flutter
import flutter_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) {
    //
    // Integration note:
    //
    // In Flutter, in order to work in background isolate, plugins need to register with
    // a special instance of `FlutterEngine` that serves for background execution only.
    // Hence, all (and only) plugins that require background execution feature need to 
    // call `register` in this function. 
    //
    // The default `GeneratedPluginRegistrant` will call `register` of all plugins integrated
    // in your application. Hence, if you are using `FlutterDownloaderPlugin` along with other
    // plugins that need UI manipulation, you should register `FlutterDownloaderPlugin` and any
    // 'background' plugins explicitly like this:
    //   
    // if (!registry.hasPlugin("FlutterDownloaderPlugin")) {
    //    FlutterDownloaderPlugin.register(with: registry.registrar(forPlugin: "FlutterDownloaderPlugin"))
    // }
    //
    GeneratedPluginRegistrant.register(with: registry)
}

Optional configuration: #

  • 支持HTTP请求:如果要使用HTTP请求下载文件,则需要禁用Apple Transport Security(ATS)功能. 有两种选择:
  1. 仅对特定域禁用ATS :(将以下代码添加到Info.plist文件中)
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>www.yourserver.com</key>
    <dict>
      <!-- add this key to enable subdomains such as sub.yourserver.com -->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!-- add this key to allow standard HTTP requests, thus negating the ATS -->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!-- add this key to specify the minimum TLS version to accept -->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>
  1. 完全禁用ATS :(将以下代码添加到您的Info.plist文件中)
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key><true/>
</dict>
  • 配置并发任务的最大数量:默认情况下,该插件允许一次运行3个下载任务(如果排队3个以上的任务,则只有3个任务正在运行,其他任务处于待处理状态). 您可以通过在Info.plist文件中添加以下代码来更改此数字.
<!-- changes this number to configure the maximum number of concurrent tasks -->
<key>FDMaximumConcurrentTasks</key>
<integer>5</integer>
  • 本地化通知消息:如果在您的应用程序未在前台运行时下载了所有文件,则插件将发送一条通知消息以通知用户. 默认情况下,此消息为英文. 您可以通过在Info.plist文件中添加和本地化以下消息来本地化此消息. (您可以在此链接中找到Info.plist本地化的详细信息)
<key>FDAllFilesDownloadedMessage</key>
<string>All files have been downloaded</string>

Note:

  • 该插件仅支持在NSDocumentDirectory保存文件

Android integration #

Required configuration: #

  • 如果您的项目在Flutter v1.12之前的版本上运行,请查看此文档以配置您的Android项目.

  • 从具有Android v2嵌入功能的Flutter v1.12开始,不需要其他配置即可在Android中使用后台隔离.

  • 为了处理对通知的单击操作以在Android上打开下载的文件,您需要添加一些其他配置. 将以下代码添加到您的AndroidManifest.xml

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

Note:

  • 您必须将下载的文件保存在外部存储中(其他应用程序有权读取您的文件)
  • 仅当您的设备至少具有一个可以读取这些文件类型(mp3,pdf等)的应用程序时,才能打开下载的文件

Optional configuration: #

  • 配置并发任务的最大数量:该插件取决于WorkManager库,而WorkManager取决于可配置一次运行的最大任务数量的可用处理器数量. 您可以通过将以下代码添加到AndroidManifest.xml来为此配置设置一个固定编号:
 <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">
     <!-- changes this number to configure the maximum number of concurrent tasks -->
     <meta-data
         android:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS"
         android:value="5" />
 </provider>
  • 本地化通知消息:您可以通过本地化以下消息来本地化下载进度的通知消息. (您可以在此链接中找到Android中字符串本地化的详细信息)
<string name="flutter_downloader_notification_started">Download started</string>
<string name="flutter_downloader_notification_in_progress">Download in progress</string>
<string name="flutter_downloader_notification_canceled">Download canceled</string>
<string name="flutter_downloader_notification_failed">Download failed</string>
<string name="flutter_downloader_notification_complete">Download complete</string>
<string name="flutter_downloader_notification_paused">Download paused</string>
  • PackageInstaller:为了打开APK文件,您的应用程序需要REQUEST_INSTALL_PACKAGES权限. 在您的AndroidManifest.xml添加以下代码:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

Usage #

Import package: #

import 'package:flutter_downloader/flutter_downloader.dart';

Initialize #

WidgetsFlutterBinding.ensureInitialized();
await FlutterDownloader.initialize();
  • 注意:插件必须在使用前初始化.

Create new download task: #

final taskId = await FlutterDownloader.enqueue(
  url: 'your download link',
  savedDir: 'the path of directory where you want to save downloaded files',
  showNotification: true, // show download progress in status bar (for Android)
  openFileFromNotification: true, // click on notification to open downloaded file (for Android)
);

Update download progress: #

FlutterDownloader.registerCallback(callback); // callback is a top-level or static function

重要说明:您的UI是在主隔离中呈现的,而下载事件则来自后台隔离(换句话说, callback中的代码在后台隔离中运行),因此您必须处理两个隔离之间的通信. 例如:

ReceivePort _port = ReceivePort();

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

	IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');
	_port.listen((dynamic data) {
		String id = data[0];
		DownloadTaskStatus status = data[1];
		int progress = data[2];
		setState((){ });
	});

	FlutterDownloader.registerCallback(downloadCallback);
}

@override
void dispose() {
	IsolateNameServer.removePortNameMapping('downloader_send_port');
	super.dispose();
}

static void downloadCallback(String id, DownloadTaskStatus status, int progress) {
	final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port');
	send.send([id, status, progress]);
}

Load all tasks: #

final tasks = await FlutterDownloader.loadTasks();

Load tasks with conditions: #

final tasks = await FlutterDownloader.loadTasksWithRawQuery(query: query);
  • 注意:为了成功将数据解析为DownloadTask对象,您应该使用DB中的所有字段加载数据(换句话说,使用: SELECT * ). 例如:
SELECT * FROM task WHERE status=3
  • 注意:以下是此插件存储任务信息的task表的架构
CREATE TABLE `task` (
	`id`	INTEGER PRIMARY KEY AUTOINCREMENT,
	`task_id`	VARCHAR ( 256 ),
	`url`	TEXT,
	`status`	INTEGER DEFAULT 0,
	`progress`	INTEGER DEFAULT 0,
	`file_name`	TEXT,
	`saved_dir`	TEXT,
	`resumable`	TINYINT DEFAULT 0,
	`headers`	TEXT,
	`show_notification`	TINYINT DEFAULT 0,
	`open_file_from_notification`	TINYINT DEFAULT 0,
	`time_created`	INTEGER DEFAULT 0
);

Cancel a task: #

FlutterDownloader.cancel(taskId: taskId);

Cancel all tasks: #

FlutterDownloader.cancelAll();

Pause a task: #

FlutterDownloader.pause(taskId: taskId);

Resume a task: #

FlutterDownloader.resume(taskId: taskId);
  • 注意: resume()将返回一个新的taskId对应于一个新的后台任务,该任务是为继续下载过程而创建的. 您应该用此新taskId替换原始taskId (标记为paused状态),以继续跟踪下载进度.

Retry a failed task: #

FlutterDownloader.retry(taskId: taskId);
  • 注意: retry()将返回一个新的taskId (如resume()

Remove a task: #

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

Open and preview a downloaded file: #

FlutterDownloader.open(taskId: taskId);
  • 注意:在Android中,只有将下载的文件放在外部存储中并且至少有一个应用程序可以在您的设备上读取该文件类型时,才能打开该文件.

Bugs/Requests #

如果您遇到任何问题,请随时提出问题. 如果您觉得图书馆缺少某个功能,请在Github上举票. 拉请求也欢迎.

1.4.0 - 12.01.2020 #

  • 迁移到Android v2嵌入.

1.3.4 - 21.12.2019 #

  • 修复Flutter v12.13中的错误
  • 修复将int强制转换为long值的错误

1.3.3 - 03.11.2019 #

  • 更新文件
  • 断言并确保FlutterDownloader初始化一次.

1.3.2 - 24.10.2019 #

  • 正确的文档和有关与背景隔离进行通信的示例代码

1.3.1 - 18.09.2019 #

  • 断言FlutterDownloader的初始化

1.3.0 - 16.09.2019 #

  • 突破性变化 :该插件已经过重构,以支持具有后台隔离功能的更新下载事件. 为了在Dart中支持后台执行,从平台代码接收事件的callback现在必须是静态或顶级函数. iOS和Android上还需要其他本机配置. 有关详细信息,请参见自述文件.
  • Android:将WorkManager升级到v2.2.0.
  • 修复在Android中将图像/视频保存到内部存储时出现的SecurityException错误
  • 修复错误无法将视频保存在Android中.

1.2.2 - 19.09.2019 #

  • Android:修正错误

1.2.1 - 27.08.2019 #

  • Android:在使用FlutterFragmentActivity情况下,热修复程序取消注册BroadcastReceiver

1.2.0 - 27.08.2019 #

  • Android:支持FlutterFragmentActivity ,修复在图库应用程序中未显示的已下载图像/视频文件的错误,改进了HTTP重定向的实现,修复了在某些情况下无法打开apk文件的错误

1.1.9 - 18.07.2019 #

  • Android:支持HTTP重定向
  • iOS:从HTTP响应正确获取文件名

1.1.8 - 16.07.2019 #

  • 修复iOS中的错误:从iOS 8开始,每次您重新启动应用程序时,应用程序沙箱的绝对路径都会更改,因此需要savedDir路径来截断更改部分,然后再将其保存到数据库,并在每次从数据库加载时重新创建绝对路径. 当前,该插件仅支持NSDocumentDirectory保存文件.
  • 修复错误是iOS:如果应用程序终止,则设置错误的任务状态
  • Android:升级依赖项

1.1.7 - 24.03.2019 #

  • Android:将WorkManager升级到2.0.0版(AndroidX)

1.1.6 - 09.02.2019 #

  • Android:将WorkManager升级到1.0.0-beta05版本
  • Android:迁移到AndroidX

1.1.5 - 27.01.2019 #

  • Android:将WorkManager升级到1.0.0-beta03版本
  • 修正错误

1.1.4 - 06.01.2019 #

  • 添加remove()功能还可以删除任务(在数据库中)和下载的文件(可选).
  • 通过在registerCallback()中将callback设置为null来支持清理回调
  • Android:将WorkManager升级到1.0.0-beta01版本

1.1.3 - 18.11.2018 #

  • Android:修复saveFilePath Bug NullPointerException

1.1.2 - 14.11.2018 #

  • Android:修正拼写错误
  • iOS:在发生错误的情况下捕获HTTP状态代码

1.1.1 - 12.11.2018 #

  • correct README instruction

1.1.0 - 12.11.2018 #

  • Android:将WorkManager库升级到版本v1.0.0-alpha11
  • BREAKING CHANGE :删除了initialize() (以处理v1.0.0-alpha11中WorkManager的初始化更改). 该插件使用默认配置进行初始化. 如果要更改默认配置,可以按照README.md的说明进行README.md

1.0.6 - 28.10.2018 #

  • 修复与filename有关的错误

1.0.5 - 22.10.2018 #

  • Android:重新配置依赖项

1.0.4 - 20.10.2018 #

  • Android:将WorkManager升级到v1.0.0-alpha10

1.0.3 - 29.09.2018 #

  • Android:将编译SDK版本升级到28

1.0.2 - 20.09.2018 #

  • 固定Flutter社区徽章.

1.0.1 - 20.09.2018 #

1.0.0 - 09.09.2018 #

  • 功能:初始化,loadTasksWithRawQuery,暂停,继续,重试,打开
  • 重要提示 :插件必须首先由initialize()
  • clickToOpenDownloadedFile 变化clickToOpenDownloadedFile现在重命名为openFileFromNotification (以防止与open功能混淆). 静态属性maximumConcurrentTask已删除,此配置现在移入initialize()方法.
  • 该插件在Android和iOS上都完全支持SQLite,现在它本身可以持久地管理其状态并公开loadTasksWithRawQuery api,该API有助于开发人员以自定义条件从SQLite数据库加载任务
  • 支持使用initialize()方法的messages参数本地化Android通知消息
  • 完全支持使用open()方法打开和预览下载的文件
  • (iOS集成)无需手动覆盖application:handleEventsForBackgroundURLSession:completionHandler:现在,该插件现在自己负责处理它

0.1.1 - 29.08.2018 #

  • 修复错误:SQLite泄漏
  • 新功能:支持最大并发下载任务的配置
  • 将WorkManager升级到v1.0.0-alpha08

0.1.0 - 12.08.2018 #

  • 添加:处理单击通知以打开下载的文件(适用于Android)

0.0.9 - 10.08.2018 #

  • 重新配置以支持Dart2

0.0.8 - 10.08.2018 #

  • 将WorkManager升级到v1.0.0-alpha06
  • 修复错误:禁用通知声音

0.0.7 - 28.06.2018 #

  • 将WorkManager升级到v1.0.0-alpha04

0.0.6 - 28.06.2018 #

  • 将WorkManager升级到v1.0.0-alpha03
  • showNotification默认值showNotificationtrue (在Android 8.0及更高版本中有意义,当应用程序进入后台时,它有助于我们的任务不会被系统杀死)

0.0.5 - 22.06.2018 #

  • 更新元数据

0.0.4 - 15.06.2018 #

  • 修复错误:工人在Android API 26及更高版本上以FAILURE完成

0.0.3 - 11.06.2018 #

  • 支持HTTP头

0.0.2 - 08.06.2018 #

  • 正确的自述文件

0.0.1 - 07.06.2018 #

  • 初始发行.

example/README.md

flutter_downloader_example #

演示如何使用flutter_downloader插件.

Getting Started #

要获得Flutter入门方面的帮助,请查看我们的在线文档 .

Use this package as a library

1. Depend on it

将此添加到包的pubspec.yaml文件中:


dependencies:
  flutter_downloader: ^1.4.0

2. Install it

您可以从命令行安装软件包:

使用Flutter:


$ flutter pub get

另外,您的编辑器可能支持flutter pub get . 查看您的编辑器文档以了解更多信息.

3. Import it

现在,在Dart代码中,您可以使用:


import 'package:flutter_downloader/flutter_downloader.dart';
  
Popularity:
描述该程序包相对于其他程序包的受欢迎程度. [更多]
98
Health:
从静态分析得出的代码运行状况. [更多]
100
Maintenance:
反映出软件包的整洁和最新状态. [更多]
100
Overall:
以上的加权分数. [更多]
99
了解有关得分的更多信息.

我们在2020年1月21日对该程序包进行了分析,并在下面提供了得分,详细信息和建议. using: 分析已完成,状态使用以下命令 :

  • 飞镖:2.7.0
  • pana: 0.13.4
  • Flutter:1.12.13 + hotfix.5

Dependencies

Package Constraint Resolved Available
直接依赖
Dart SDK >=1.20.1 <3.0.0
flutter 0.0.0
传递依存关系
collection 1.14.11 1.14.12
meta 1.1.8
sky_engine 0.0.99
typed_data 1.1.6
vector_math 2.0.8
开发依赖
flutter_test

by  ICOPY.SITE