Flutter框架内部如何以及在哪里调用StatefulWidget对应State的build方法?
核心调用位置
State类build方法的调用逻辑位于Flutter框架package:flutter/src/widgets/framework.dart文件中,核心触发链路如下:
1. 前置绑定逻辑
当StatefulWidget被挂载到Widget树时,框架会先创建对应的StatefulElement实例,构造阶段会同时完成三个绑定操作:
- 调用
widget.createState()生成State实例 - 将State的
widget属性指向当前StatefulWidget实例 - 将State的私有
_element属性指向当前StatefulElement实例,二者生命周期完全绑定
2. 实际调用逻辑
Element需要更新时,框架会先调用Element基类的rebuild()方法,该方法内部最终会调用子类实现的performBuild()方法。StatefulElement对performBuild()的实现就是直接调用持有State的build方法,核心源码如下:
@override void performBuild() { assert(_state != null); try { // 直接调用State的build方法,传入当前Element作为BuildContext参数 built = _state!.build(this); } catch (e, stack) { // 异常捕获逻辑,生成ErrorWidget展示崩溃信息 _debugDoingBuild = false; built = ErrorWidget.builder( _reportException( ErrorDescription('building $this'), e, stack, informationCollector: () => <DiagnosticsNode>[ DiagnosticsDebugCreator(DebugCreator(this)), ], ), ); } super.performBuild(); }
3. 和StatelessWidget的实现差异
StatelessWidget对应的Element子类是StatelessElement,它的performBuild()实现是直接调用Widget自身的build方法,这就是两种Widget的build方法定义位置不同的核心原因:
@override void performBuild() { try { built = widget.build(this); } catch (e, stack) { built = ErrorWidget.builder( _reportException(ErrorDescription('building $this'), e, stack), ); } super.performBuild(); }
常见触发build的场景
所有触发Element重建的操作最终都会走到上述调用链路,常见场景包括:
- StatefulWidget首次挂载到Widget树
- 调用
State.setState()方法标记脏状态 - 父节点更新,传入了新的StatefulWidget实例
- State依赖的
InheritedWidget发生变更
内容的提问来源于stack exchange,提问作者Shuji
相关产品推荐
相关产品推荐

