温故知新-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;
      }());
    }
  }
相关推荐
默默_david6 小时前
14.5 绘制(一)绘制原理及Layer——问答
flutter
LinXunFeng21 小时前
Flutter 拖拉对比组件,换装图片前后对比必备
前端·flutter·开源
2501_9197490321 小时前
配置flutter鸿蒙的环境和创建并运行第一个flutter鸿蒙项目【精心制作】
flutter·华为·harmonyos
YUFENGSHI.LJ1 天前
Flutter 如何使用fvm进行多项目sdk管理
flutter
开心-开心急了1 天前
关于Flutter与Qt for python 的一些技术、开源、商用等问题
开发语言·python·qt·flutter
猫林老师1 天前
Flutter for HarmonyOS开发指南(四):国际化与本地化深度实践
flutter·华为·harmonyos
猫林老师2 天前
Flutter for HarmonyOS 开发指南(一):环境搭建与项目创建
flutter·华为·harmonyos
sunly_2 天前
Flutter:视频预览功能
javascript·flutter·音视频
勤劳打代码2 天前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
2501_915918412 天前
Flutter 加固方案对比与实战,多工具组合的跨平台安全体系(Flutter App 加固/IPA 成品混淆/Ipa Guard CLI/自动化安全流程)
安全·flutter·ios·小程序·uni-app·自动化·iphone