Flutter:如何判断 widget 绘制状态

395 阅读1分钟

直接上代码:

//flutter调度阶段是否为 build/layout/paint
bool get isPersistentCallbacks =>
      SchedulerBinding.instance?.schedulerPhase ==
      SchedulerPhase.persistentCallbacks;

使用场景,例如重写 OverLayEntry 中 markNeedsBuild 方法

@override
  void markNeedsBuild() {
    if (isPersistentCallbacks) {
      SchedulerBinding.instance?.addPostFrameCallback((_) {
        super.markNeedsBuild();
      });
    } else {
      super.markNeedsBuild();
    }
  }
课后知识整理

Flutter中有几个调度阶段:

  • transientCallbacks : 主要处理动画计算,动画状态的更新
  • midFrameMicrotasks : 处理transientCallbacks阶段触发的Microtasks,啥是Microtasks
  • persistentCallbacks : 主要在下一帧之前,做一些清理工作或者准备工作
  • idle : 不产生Frame的空闲期,可以处理Tasks(由SchedulerBinding.scheduleTask触发),microtasks(由scheduleMicrotask触发),定时器的回调,响应事件处理(例如:用户的输入