Need help with flutter_downloader?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

645 Stars 297 Forks BSD 3-Clause "New" or "Revised" License 242 Commits 259 Opened issues


Flutter Downloader - A plugin for creating and managing download tasks. Supports iOS and Android. Maintainer: @hnvn

Services available


Need anything else?

Contributors list

Flutter Community: flutter_downloader

Flutter Downloader

pub package

A plugin for creating and managing download tasks. Supports iOS and Android.

This plugin is based on

in Android and
in iOS to run download task in background mode.

Development note:

The changes of external storage APIs in Android 11 cause some problems with the current implementation. I decide to re-design this plugin with new strategy to manage download file location. It is still in triage and discussion in this PR. It is very appreciated to have contribution and feedback from Flutter developer to get better design for the plugin.

iOS integration

Required configuration:

Note: following steps requires to open your

project in Xcode.
  • Enable background mode.

  • Add

  • Configure

Objective-C: ```objective-c /// AppDelegate.h



@interface AppDelegate : FlutterAppDelegate

@end ```

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

@implementation AppDelegate

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

  • (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]; }


Or Swift: ```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) { if (!registry.hasPlugin("FlutterDownloaderPlugin")) { FlutterDownloaderPlugin.register(with: registry.registrar(forPlugin: "FlutterDownloaderPlugin")!) } }

### Optional configuration:

  • Support HTTP request: if you want to download file with HTTP request, you need to disable Apple Transport Security (ATS) feature. There're two options:
  1. Disable ATS for a specific domain only: (add following codes to your Info.plist file)

````xml NSAppTransportSecurity NSExceptionDomains NSIncludesSubdomains NSTemporaryExceptionAllowsInsecureHTTPLoads NSTemporaryExceptionMinimumTLSVersion TLSv1.1

  1. Completely disable ATS: (add following codes to your


  • Configure maximum number of concurrent tasks: the plugin allows 3 download tasks running at a moment by default (if you enqueue more than 3 tasks, there're only 3 tasks running, other tasks are put in pending state). You can change this number by adding following codes to your
  • Localize notification messages: the plugin will send a notification message to notify user in case all files are downloaded while your application is not running in foreground. This message is English by default. You can localize this message by adding and localizing following message in
    file. (you can find the detail of
    localization in this link)
All files have been downloaded

Note: - This plugin only supports save files in


Android integration

Required configuration:

  • If your project is running on Flutter versions prior v1.12, have a look at this document to configure your Android project.

  • From Flutter v1.12 with Android v2 embedding there's no additional configurations required to work with background isolation in Android (but you need to setup your project properly. See upgrading pre 1.12 Android projects)

  • In order to handle click action on notification to open the downloaded file on Android, you need to add some additional configurations. Add the following codes to your


Note: - You have to save your downloaded files in external storage (where the other applications have permission to read your files) - The downloaded files are only able to be opened if your device has at least an application that can read these file types (mp3, pdf, etc)

Optional configuration:

  • Configure maximum number of concurrent tasks: the plugin depends on
    library and
    depends on the number of available processor to configure the maximum number of tasks running at a moment. You can setup a fixed number for this configuration by adding following codes to your


  • Localize notification messages: you can localize notification messages of download progress by localizing following messages. (you can find the detail of string localization in Android in this link)
Download started
Download in progress
Download canceled
Download failed
Download complete
Download paused
  • PackageInstaller: in order to open APK files, your application needs
    permission. Add following codes in your


Import package:

import 'package:flutter_downloader/flutter_downloader.dart';


await FlutterDownloader.initialize(
  debug: true // optional: set false to disable printing logs to console
  • Note: the plugin must be initialized before using.

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

Important note: your UI is rendered in the main isolate, while download events come from a background isolate (in other words, codes in

are run in the background isolate), so you have to handle the communication between two isolates. For example:
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((){ });



@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);
  • Note: In order to parse data into
    object successfully, you should load data with all fields from DB (in the other word, use:
    SELECT *
    ). For example:
SELECT * FROM task WHERE status=3
  • Note: the following is the schema of
    table where this plugin stores tasks information
    `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:


Pause a task:

FlutterDownloader.pause(taskId: taskId);

Resume a task:

FlutterDownloader.resume(taskId: taskId);
  • Note:
    will return a new
    corresponding to a new background task that is created to continue the download process. You should replace the original
    (that is marked as
    status) by this new
    to continue tracking the download progress.

Retry a failed task:

FlutterDownloader.retry(taskId: taskId);
  • Note:
    will return a new

Remove a task:

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

Open and preview a downloaded file: taskId);
  • Note: in Android, you can only open a downloaded file if it is placed in the external storage and there's at least one application that can read that file type on your device.


If you encounter any problems feel free to open an issue. If you feel the library is missing a feature, please raise a ticket on Github. Pull request are also welcome.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.