温故知新-WidgetsBinding

WidgetsBinding

它是widget层与Flutter引擎的粘合剂,管理着以`rootElement`为根的单一`Element`树, 调用 `runApp`(间接调用 `attachRootWidget`)会创建该`rootElement`。

在WidgetsBinding中有一个重要的字段BuildOwner,它负责widget层的构建和更新,在此binding中初始化且设置onBuildScheduled回调。

所有widget的BuidlerOwner都是此_buildOwner,在创建rootElement时赋值给根节点,然后通过根节点传递下去(element执行mount的时候,_owner = parent.owner,_parentBuildScope = parent.buildScope),一同传递下去的还有BuildScope。

js 复制代码
void initInstances() {
    super.initInstances();
    _instance = this;
    _buildOwner = BuildOwner();
    buildOwner!.onBuildScheduled = _handleBuildScheduled;
    ......
  }
  void _handleBuildScheduled() {
    ensureVisualUpdate();
  }
  
  void attachToBuildOwner(RootWidget widget) {
    final bool isBootstrapFrame = rootElement == null;
    _readyToProduceFrames = true;
    _rootElement = widget.attach(buildOwner!, rootElement as RootElement?);
    if (isBootstrapFrame) {
      SchedulerBinding.instance.ensureVisualUpdate();
    }
  }

BuidlerOwner记录所有被标记的脏元素列表,在下一帧执行drawFrame时,调用buildOwner.buildScope方法时重新buildelement元素。
super.drawFrame(); 会调用RendererBinding的drawFrame去启动PipelineOwner重新绘制UI。

js 复制代码
@override
  void drawFrame() {
    TimingsCallback? firstFrameCallback;
    ......
    try {
      if (rootElement != null) {
        buildOwner!.buildScope(rootElement!);
      }
      super.drawFrame();
      buildOwner!.finalizeTree();
    } finally {
      assert(() {
        debugBuildingDirtyElements = false;
        return true;
      }());
    }
  }
相关推荐
码林鼠1 天前
flutter状态管理入门教程-Riverpod
开发语言·javascript·flutter
码林鼠1 天前
flutter网络http请求入门教程-dio
网络协议·flutter·http
码林鼠1 天前
flutter BLoC 单向数据流完整教程
flutter
恋猫de小郭1 天前
Flutter 官方表示:AI 时代代码越来越容易写,为什么还要一套代码库?
android·前端·flutter
喵个咪2 天前
GoWind ShortPlay 拆解:Flutter 沉浸式 Feed 的播放器工程——生命周期、手势状态机与游客降级
前端·flutter·架构
恋猫de小郭3 天前
Flutter 的文字为什么比 SwiftUI 更细?问题主要在 Skia 的 256 项查找表里
android·前端·flutter
好的佩奇4 天前
Dart 之类型系统
flutter·dart
恋猫de小郭4 天前
Dart 3.15 新特性:this 终于支持类型提升了
android·前端·flutter
FungLeo5 天前
成为全栈·Flutter App 篇·主题与可访问性:深浅色、大字号和触控体验
flutter·移动开发·深色模式·可访问性·成为全栈·大字号适配