Flutter的dart:ui库中PluginUtilities有什么作用?该如何使用?
Flutter
PluginUtilities 类详解 PluginUtilities 是Flutter dart:ui 库中专为插件开发者提供的工具类,核心作用是解决Dart Isolate内存隔离场景下的函数跨域传递问题:普通Dart函数的引用无法直接在不同Isolate、或是Dart层与原生层之间传递,该类可将函数转换为可序列化传输的句柄,也可通过句柄还原原函数进行调用。
适用场景
- 插件需要在后台Isolate执行耗时任务,执行完成后需要回调主Isolate的Dart函数更新UI的场景
- 原生侧(Android/iOS)异步执行任务完成后,需要调用Dart侧自定义回调的场景
- 任意需要跨Isolate传递函数引用,避免内存隔离导致函数无法正常调用的场景
具体使用方法
1. 将Dart回调转换为可传递句柄
调用PluginUtilities.getCallbackHandle()方法,传入需要传递的函数,即可得到CallbackHandle类型的句柄,该句柄可序列化后跨Isolate、跨原生层传递:
import 'dart:ui'; // 仅顶层函数/静态函数可被转换,实例方法不支持 void customCallback(String taskResult) { print('任务执行结果:$taskResult'); } // 转换为可传递的句柄 final CallbackHandle? handle = PluginUtilities.getCallbackHandle(customCallback); // 提取句柄的整型值,方便存储或传递给原生层、其他Isolate final int? rawHandle = handle?.toRawHandle();
2. 从句柄还原回调函数
拿到序列化后的句柄值后,可通过反向API还原出原函数直接调用:
// 假设此处拿到了之前传递过来的rawHandle值 final CallbackHandle handle = CallbackHandle.fromRawHandle(rawHandle); // 还原回调函数 final Function? restoredCallback = PluginUtilities.getCallbackFromHandle(handle); // 校验非空后即可调用 if (restoredCallback != null) { restoredCallback('任务执行成功'); }
注意:仅顶层函数或静态类方法可以通过
PluginUtilities完成转换和还原,类的实例方法依赖具体实例对象,无法跨Isolate共享内存,因此不支持转换。
内容的提问来源于stack exchange,提问作者Ben Butterworth
相关产品推荐
相关产品推荐

