温故知新-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(); 会调用RendererBindingdrawFrame去启动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;
      }());
    }
  }
相关推荐
西西学代码24 分钟前
flutter---进度条(2)
前端·javascript·flutter
QuantumLeap丶30 分钟前
《Flutter全栈开发实战指南:从零到高级》- 21 -响应式设计与适配
android·javascript·flutter·ios·前端框架
晚霞的不甘31 分钟前
实战精要:构建企业级 Flutter + OpenHarmony 工业物联网(IIoT)监控平台
物联网·flutter
等你等了那么久1 小时前
Flutter路由3分钟学会
flutter·dart
百分三十七1 小时前
最新的 Dart sdk 安装教程
flutter·dart
赵财猫._.1 小时前
【Flutter x 鸿蒙】第三篇:鸿蒙特色UI组件与Flutter的融合使用
flutter·ui·harmonyos
晚霞的不甘3 小时前
实战:从零构建一个支持手机、手表与车机的 Flutter 全场景健康应用
flutter·智能手机
kirk_wang3 小时前
当Flutter遇见纯血鸿蒙:SQLite兼容适配的实战与思考
flutter·移动开发·跨平台·arkts·鸿蒙
克喵的水银蛇4 小时前
Flutter 通用输入框封装实战:带校验 / 清除 / 密码切换的 InputWidget
前端·javascript·flutter
小蜜蜂嗡嗡17 小时前
flutter namespace问题
android·flutter