Flutter如何实现flutter_downloader的通信功能

在Flutter中使用flutter_downloader插件时,如何实现原生端与Flutter端的通信功能?具体需要处理下载进度、状态更新等回调,但文档中对MethodChannel的配置说明不够详细。能否提供完整的通信实现示例,包括Dart端注册回调、Android/iOS原生端的处理逻辑?尤其想知道如何处理多个下载任务同时进行时的通信隔离问题。

2 回复

Flutter通过MethodChannel实现与原生平台的通信。在flutter_downloader中,Flutter端通过invokeMethod调用原生下载方法,原生端通过MethodCallHandler接收指令并返回结果,实现双向通信。

更多关于Flutter如何实现flutter_downloader的通信功能的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter 中 flutter_downloader 插件通过 MethodChannel 实现原生平台(Android/iOS)与 Flutter 之间的通信。以下是实现步骤:

1. 初始化插件与通信设置

pubspec.yaml 中添加依赖:

dependencies:
  flutter_downloader: ^1.10.0

2. 配置原生端

AndroidAndroidManifest.xml):

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

iOSInfo.plist):

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

3. Flutter 端通信实现

注册下载回调

main() 中注册后台隔离监听:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  await FlutterDownloader.initialize(
    debug: true, // 可选:调试模式
  );
  FlutterDownloader.registerCallback(downloadCallback); // 绑定回调
  runApp(MyApp());
}

// 后台隔离回调(静态方法)
@pragma('vm:entry-point')
static void downloadCallback(String id, DownloadTaskStatus status, int progress) {
  // 通过 EventBus 或 Isolate 通信将状态传回主线程
  IsolateNameServer.lookupPortByName('downloader_send_port')
      ?.send([id, status, progress]);
}

创建通信端口

在主线程中创建接收端口:

void initState() {
  super.initState();
  final port = ReceivePort();
  IsolateNameServer.registerPortWithName(port.sendPort, 'downloader_send_port');
  port.listen((data) {
    // 处理下载进度/状态更新
    String id = data[0];
    DownloadTaskStatus status = data[1];
    int progress = data[2];
    setState(() {
      // 更新UI
    });
  });
}

触发下载任务

void startDownload(String url) async {
  final taskId = await FlutterDownloader.enqueue(
    url: url,
    savedDir: '/storage/emulated/0/Download',
    showNotification: true,
    openFileFromNotification: true,
  );
}

4. 关键通信流程

  1. Flutter → 原生:通过 MethodChannel 调用 enqueue 等方法。
  2. 原生 → Flutter
    • 原生平台通过 BackgroundChannel 发送进度/状态。
    • Flutter 的 downloadCallback 在后台隔离中接收数据。
    • 通过 ReceivePort 将数据传回主线程更新UI。

注意事项

  • 后台隔离限制:回调函数需使用 @pragma('vm:entry-point') 并保持静态。
  • UI更新:需通过 Isolate 通信或 EventBus 将数据传递到主线程。
  • 在 Android 上需处理存储权限,iOS 需配置后台模式。

通过以上步骤,即可实现 flutter_downloader 的完整通信功能。

回到顶部