runApp 到 createElement
接上篇,在StatefulWidget里有两个方法
@override
StatefulElement createElement() => StatefulElement(this);
@protected
State createState();
StatefulElement(StatefulWidget widget)
: _state = widget.createState(),
super(widget) {
_state._element = this;
_state._widget = widget;
}
在代码里可以看出createState方法是在StatefulElement的初始化列表里调用初始化了.然而并没有调用createElement的地方.
从runApp开始到createElement
void runApp(Widget app) {
WidgetsFlutterBinding.ensureInitialized()
..scheduleAttachRootWidget(app) //这一行
..scheduleWarmUpFrame();
}
@protected
void scheduleAttachRootWidget(Widget rootWidget) {
Timer.run(() {
attachRootWidget(rootWidget); //这一行
});
}
void attachRootWidget(Widget rootWidget) {
_readyToProduceFrames = true;
_renderViewElement = RenderObjectToWidgetAdapter<RenderBox>(
container: renderView,
debugShortDescription: '[root]',
child: rootWidget,
)
//这一行
.attachToRenderTree(buildOwner, renderViewElement as RenderObjectToWidgetElement<RenderBox>);
}
RenderObjectToWidgetElement<T> attachToRenderTree(BuildOwner owner, [ RenderObjectToWidgetElement<T> element ]) {
if (element == null) {
owner.lockState(() {
element = createElement();
assert(element != null);
element.assignOwner(owner);
});
owner.buildScope(element, () {
//这一行
element.mount(null, null);
});
SchedulerBinding.instance.ensureVisualUpdate();
} else {
element._newWidget = this;
element.markNeedsBuild();
}
return element;
}
@override
void mount(Element parent, dynamic newSlot) {
super.mount(parent, newSlot);
//这一行
_rebuild();
}
void _rebuild() {
try {
//这一行
_child = updateChild(_child, widget.child, _rootChildSlot);
} catch (exception, stack) {
...
}
}
//最底下那个方法所调用的updateChild就是这个方法,这里是递归初始化组件的
@protected
Element updateChild(Element child, Widget newWidget, dynamic newSlot) {
...
if (child != null) {
} else {
//这一行
newChild = inflateWidget(newWidget, newSlot);
}
return newChild;
}
@protected
Element inflateWidget(Widget newWidget, dynamic newSlot) {
final Key key = newWidget.key;
if (key is GlobalKey) {
final Element newChild = _retakeInactiveElement(key, newWidget);
if (newChild != null) {
newChild._activateWithParent(this, newSlot);
final Element updatedChild = updateChild(newChild, newWidget, newSlot);
return updatedChild;
}
}
//这里调用的就widget的createElement
final Element newChild = newWidget.createElement();
//下面是继续向下初始化子组件,这里的mount是当前Element的mount,如果是Stateless或Stateful它们都是继承ComponentElement
newChild.mount(this, newSlot);
return newChild;
}
//这里的mount是ComponentElement的mount
@override
void mount(Element parent, dynamic newSlot) {
super.mount(parent, newSlot);
_firstBuild();
}
void _firstBuild() {
rebuild();
}
void rebuild() {
if (!_active || !_dirty)
return;
Element debugPreviousBuildTarget;
//这一行
performRebuild();
}
@override
void performRebuild() {
built = build();
try {
//这一行,这里就形成了一个递归,这里的updateChild就是上面的updateChild
//这里的built就是Stateless或Stateful里的build函数所返回的组件
_child = updateChild(_child, built, slot);
} catch (e, stack) {
...
}
}
以上就是调用createElement的地方