SchedulerBinding.instance.addPostFrameCallback是否需要手动移除

504 阅读1分钟

在使用 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;
  }
}