搜尋套件、儲存庫與 APP 分類

套件詳情v9.6.5

background_downloader

一個跨平台的背景檔案下載和上傳工具。定義任務,排隊並監控進度

AndroidiOSmacOSWindowsLinux
近 30 天下載
27.7萬
喜歡數
505
Pub 分數
160

安裝套件

flutter pub add background_downloader

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

一個跨平台的 Flutter 套件,可在 Android、iOS、macOS、Windows 和 Linux 上實現背景檔案下載與上傳。它允許開發者定義下載/上傳任務,排隊執行並即時監控進度。設計注重可靠性與效率,能處理網路中斷,並在應用重啟後繼續任務。適用於需要大量檔案傳輸而不阻塞 UI 的應用。

適用情境

  • 下載大型媒體檔案
  • 上傳使用者產生的內容
  • 離線資料同步
  • 後台檔案更新
  • 持續性任務管理

主要特色

  • 跨平台支援
  • 即時進度監控
  • 任務在重新啟動之間的持久化
  • 可恢復的下載/上傳
  • 任務定義的簡單 API

適合對象

  • 需要背景檔案傳輸的應用
  • 媒體或文件密集型應用
  • 離線優先的行動應用程式
  • 大型資源包的應用程式

使用建議

  • 需要適當的平台特定權限
  • 可能需要為iOS上的背景執行進行額外設定
  • 網絡狀況影響效能
  • 大檔案需要仔細的記憶體管理
  • 某些平台上的後台執行限制

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

A background file downloader and uploader for iOS, Android, MacOS, Windows and Linux

A robust, multi-platform background file transfer plugin for Flutter supporting background downloads, uploads, and data tasks across iOS, Android, MacOS, Windows, and Linux.

Uses native URLSession on iOS and MacOS, and DownloadWorker (WorkManager) / JobService (UIDT) on Android, ensuring transfers continue even when your app is in the background or terminated by the OS.


🌟 The Modern Transfer API (Recommended)

The easiest and most powerful way to use background_downloader is via the Transfer API.

On app startup (e.g. in main() or your top-level initState()), call FileDownloader().start(autoCleanDatabase: true) to activate persistent database tracking, automatically purge old task records, and reconcile transfers that completed or were interrupted while the app was suspended or closed. Then simply define a DownloadTask or UploadTask, start it using FileDownloader().transfers.start, and receive a reactive Transfer handle:

// 1. Activate database tracking & auto-cleanup on app launch (recommended)
await FileDownloader().start(autoCleanDatabase: true);

// 2. Configure notifications (recommended for userInitiated / UIDT tasks)
FileDownloader().configureNotification(
  running: const TaskNotification('Downloading', '{filename}'),
  complete: const TaskNotification('Complete', '{filename}'),
  progressBar: true,
  tapOpensFile: true,
);

// 3. Define the task with smart hints
final task = DownloadTask(
  url: 'https://example.com/large_video.mp4',
  filename: 'video.mp4',
  transferHints: {TransferHint.userInitiated, TransferHint.largeFile},
);

// 4. Start the transfer
final transfer = await FileDownloader().transfers.start(task);

// 5. Directly await the completed File:
final file = await transfer.file;
print('Downloaded to: ${file.path}');
Why use Transfer?
  • Awaitable Futures: Await transfer.file for the completed File, transfer.result for the TaskStatusUpdate, or transfer.responseBody for server response text.
  • Reactive UI Notifiers: Direct ValueNotifier bindings for Flutter widgets: transfer.progressNotifier (clean 0.0–1.0), transfer.statusNotifier, transfer.networkSpeedNotifier, transfer.timeRemainingNotifier, and transfer.notificationTapNotifier.
  • Plug-and-Play Widgets: Pre-built UI components including TransferProgressBar, TransferButton, and TransferListTile.
  • Direct Controls: Pause, resume, cancel, or allow cellular without managing task IDs: await transfer.pause(), await transfer.resume(), await transfer.cancel().
  • Batch Processing: Enqueue hundreds of transfers with aggregate progress using FileDownloader().transfers.startAll(tasks, onProgress: ...).
  • Smart Auto-Tuning & Android 14+ UIDT: Use TransferHint (userInitiated, largeFile, smallFile, lowPriority, useSuggestedFilename, binaryUpload) to configure optimal priority, Android 14+ UIDT, and pause resilience automatically.
  • Notification Tap Integration: React directly to user notification taps per transfer via transfer.notificationTapNotifier or open downloaded files automatically with tapOpensFile: true.
  • Scoping & Isolation: Modularize downloads in plugins or sub-features with isolated namespaces using FileDownloader.scoped('my_feature').
  • Network Resilience: Automatic offline holding and resume, plus configurable stall detection (stallTimeout).

👉 Read the complete Transfers Guide


🛠️ Lower-Level APIs

For specialized workflows or legacy integration, FileDownloader continues to provide direct lower-level methods:

Direct Awaitable Download (download)

Execute a task and wait for completion in a single call with inline callbacks:

final result = await FileDownloader().download(
  task,
  onProgress: (progress) => print('Progress: ${progress * 100}%'),
  onStatus: (status) => print('Status: $status'),
);

if (result.status == TaskStatus.complete) {
  print('Download finished!');
}
Queue & Event Streams (enqueue / enqueueAll)

For pipeline architectures where you monitor tasks centrally via a global stream or callbacks:

// 1. Listen centrally to task updates (typically in initState)
FileDownloader().updates.listen((update) {
  switch (update) {
    case TaskStatusUpdate():
      print('Task ${update.task.taskId} status: ${update.status}');
    case TaskProgressUpdate():
      print('Task ${update.task.taskId} progress: ${update.progress * 100}%');
  }
});

// 2. Start the downloader and activate persistent database tracking
FileDownloader().start();

// 3. Enqueue background tasks
final enqueued = await FileDownloader().enqueue(task);

📁 File Locations

To ensure file paths work robustly across platform restarts (especially on iOS and Android where container paths can change between app launches), the downloader uses a combination of BaseDirectory, directory (subdirectory) and filename:

  • BaseDirectory: One of .applicationDocuments, .temporary, .applicationSupport, or .applicationLibrary.
  • directory: An optional subdirectory within the base directory.
  • filename: The name of the file (or DownloadTask.suggestedFilename / '?' to use the server's Content-Disposition header).

See File Storage for details on shared and scoped storage.


📚 Documentation Index

Check the Topic Index or specific guides:


⚙️ Initial Setup

No setup is required for Windows or Linux.

Android

Requires Kotlin 2.1.0 or above. For modern Flutter projects, ensure your android/settings.gradle has:

plugins {
    id "org.jetbrains.kotlin.android" version "2.1.0" apply false
}
iOS

No special setup is required. By default iOS requires HTTPS connections (see Apple ATS Configuration if HTTP is required).

MacOS

Add the client network entitlement to macos/Runner/DebugProfile.entitlements and macos/Runner/Release.entitlements:

<key>com.apple.security.network.client</key>
<true/>

⚠️ Platform Notes & Limitations

  • iOS: Minimum iOS 14.0. Background transfers must complete within the system resource timeout (defaults to 4 hours, configurable via CONFIG.md).
  • Android: Minimum API 21. Standard background tasks are limited to 9 minutes by WorkManager. To allow longer downloads, set allowPause: true (or TransferHint.largeFile / userInitiated), which automatically resumes across 9-minute cycles, or set priority: 0 on Android 14+ to use UIDT (see parameters.md).
  • OS Termination: If the user forcefully swipes the app away from the iOS App Switcher or Android Recents, the OS may terminate background transfers without notification.

所屬分類

依賴

依賴清單 8 項

原始碼儲存庫

使用此套件的專案