温故知新-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踩坑排雷】第25课:ScrollController 误用坑|跳转失效、监听泄漏与“控制器未附加”
android·flutter·ios·移动开发·跨平台·dart·声明式ui
程序员老刘5 小时前
Flutter 3.50更新,开发者应该关注什么?
flutter·ai编程·客户端
好的佩奇1 天前
Dart 之集合元素
android·flutter·dart
恋猫de小郭2 天前
Flutter 3.50 & Dart 3.14 发布,快来看看有什么更新吧
android·前端·flutter
喵个咪2 天前
GoWind CMS 拆解:Flutter 设计系统内核——双态 token、四档断点与自适应壳层
前端·flutter·交互设计
恋猫de小郭3 天前
Flutter 大小核优化又被回滚,然后又开新提案?
android·前端·flutter
好的佩奇3 天前
蓝牙之广播与扫描
android·flutter·蓝牙
wuxianda10303 天前
2026 苹果审核 4.3 (a) 被拒全解析|Guideline 4.3a spam 马甲包拒审原因 + 避坑方案
flutter·uni-app·苹果上架
恋猫de小郭4 天前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter