在使用 SchedulerBinding.instance.addPostFrameCallback 后,通常情况下不需要手动移除回调。addPostFrameCallback 方法注册的回调函数将在当前帧绘制完毕后执行一次,之后会自动被移除。
该方法的作用是在下一帧绘制完成后执行回调函数,这样可以确保在构建布局完成后再执行相应的操作,例如获取控件的尺寸或执行动画等。当回调函数执行完毕后,该回调会被自动移除,无需手动清除回调。
因此,在使用 addPostFrameCallback 方法时,无需显式地移除回调。系统会自动处理回调的清理工作。
void handleDrawFrame() {
assert(_schedulerPhase == SchedulerPhase.midFrameMicrotasks);
_frameTimelineTask?.finish(); // end the "Animate" phase
try {
// PERSISTENT FRAME CALLBACKS
_schedulerPhase = SchedulerPhase.persistentCallbacks;
for (final FrameCallback callback in _persistentCallbacks)
_invokeFrameCallback(callback, _currentFrameTimeStamp!);
// POST-FRAME CALLBACKS
_schedulerPhase = SchedulerPhase.postFrameCallbacks;
final List<FrameCallback> localPostFrameCallbacks =
List<FrameCallback>.of(_postFrameCallbacks);
_postFrameCallbacks.clear();//这里会移除添加的block
for (final FrameCallback callback in localPostFrameCallbacks)
_invokeFrameCallback(callback, _currentFrameTimeStamp!);
} finally {
_schedulerPhase = SchedulerPhase.idle;
_frameTimelineTask?.finish(); // end the Frame
assert(() {
if (debugPrintEndFrameBanner)
debugPrint('▀' * _debugBanner!.length);
_debugBanner = null;
return true;
}());
_currentFrameTimeStamp = null;
}
}