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. 配置原生端
Android(AndroidManifest.xml):
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
iOS(Info.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. 关键通信流程
- Flutter → 原生:通过
MethodChannel调用enqueue等方法。 - 原生 → Flutter:
- 原生平台通过
BackgroundChannel发送进度/状态。 - Flutter 的
downloadCallback在后台隔离中接收数据。 - 通过
ReceivePort将数据传回主线程更新UI。
- 原生平台通过
注意事项
- 后台隔离限制:回调函数需使用
@pragma('vm:entry-point')并保持静态。 - UI更新:需通过
Isolate通信或EventBus将数据传递到主线程。 - 在 Android 上需处理存储权限,iOS 需配置后台模式。
通过以上步骤,即可实现 flutter_downloader 的完整通信功能。

