Flutter runApp到createElement

737 阅读1分钟

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的地方