You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:27:00