532 字
3 分钟
addPostFrameCallback 与 endOfFrame 的区别
2024-11-13

WidgetsBinding#

WidgetsBinding 类为我们提供了访问当前 widget 系统状态的能力,正如 Flutter 文档所述,它是 widget 层与 Flutter 引擎之间的粘合剂。通过 WidgetsBinding 实例,我们可以访问 addPostFrameCallbackendOfFrame.then

这两者都可以用于在当前帧的渲染阶段结束后,安排执行一个回调。但在展示它们的区别之前,我们首先需要了解什么是“渲染阶段”。

渲染阶段#

在 Flutter 中,渲染分为四个阶段,每个阶段都有其特定的目的:

  • 布局阶段(Layout phase):在布局阶段,计算 widget 的尺寸和位置,确保 widget 在屏幕上正确定位和调整大小。
  • 绘制阶段(Painting phase):在绘制阶段,根据布局阶段计算出的尺寸和位置,将 widget 绘制到屏幕上。此阶段会遍历 widget 树并调用每个 widget 的 paint 方法。
  • 合成阶段(Compositing phase):合成阶段将已绘制的 widget 组合成一个可以显示在屏幕上的图像。
  • 光栅化阶段(Rasterizing phase):这是最后一个阶段,引擎接收包含绘图指令的更新后的层树,并将其转换为像素。换句话说,场景以像素矩阵的形式显示在屏幕上。

如果你想深入了解 Flutter 中的渲染过程,可以参考 Adam Barth 的相关演讲。

addPostFrameCallbackendOfFrame.then#

正如前面提到的,“两者都可以用于在当前帧的渲染阶段结束后安排执行回调”。然而,它们在回调执行时机上有所不同:

  • addPostFrameCallback:这个方法会在“渲染阶段”结束后立即执行回调,但在引擎开始“布局阶段”之前。这对于需要在 widget 绘制完成后但布局尚未计算时执行的任务非常有用。

  • endOfFrame.then:这个方法返回一个 future,该 future 会在“渲染阶段”结束后完成,但此时第一帧的“布局阶段”已经开始。它适用于那些需要在 widget 绘制完成且布局已经计算之后执行的任务。

addPostFrameCallback 与 endOfFrame 的区别
https://blog.lpkt.cn/posts/flutter-widgetsbindings/
作者
lollipopkit
发布于
2024-11-13
许可协议
CC BY-NC-SA 4.0