flutter widget

2019-06-19  本文已影响0人  liboxiang

对于StatefulWidget,在在创建element的时候还会调用widget的createState()方法,将返回的state绑定到element。

StatelessWidget流程:

  • 系统调用StatelessElement createElement() => StatelessElement(this);
  • 绑定widget到element,

继承关系 Element-> ComponentElement-> StatelessElement

  • StatelessElement(StatelessWidget widget) : super(widget);
  • ComponentElement(Widget widget) : super(widget);
  • Element(Widget widget) : assert(widget != null), _widget = widget;
  • build StatelessElement中Widget build() => widget.build(this);

StatefulWidget流程

  • 系统调用StatefulElement createElement() => StatefulElement(this);
  • 绑定widget和state到element,同时widget也会被绑定到state

继承关系 Element-> ComponentElement-> StatelessElement

  • StatefulElement(StatefulWidget widget) : _state = widget.createState(), super(widget) {..._state._widget = widget;...}
  • ComponentElement(Widget widget) : super(widget);
  • Element(Widget widget) : assert(widget != null),_widget = widget;
  • build StatefulElement中Widget build() => state.build(this);
性能优化

rebuild流程

void buildScope(Element context, [ VoidCallback callback ]) {
···
  while (index < dirtyCount) {
···
    _dirtyElements[index].rebuild();
···
  }
···
}
void rebuild() {
    ...
    performRebuild();
   ...
    assert(!_dirty);
  }
void performRebuild() {
    //该方法中会调用build()方法
  }
//stateless
Widget build() => widget.build(this);
//stateful
Widget build() => state.build(this);

Key

局部key只会比较树中相同位置的widget,如children中index 为1的element不会复用到index为0的element位置,如果是children从后面添加元素,则前面的element可以复用。如果父element被重建,则子element一定也会被重建

StatelessWidget 如果canUpdate,会调用widget的build方法。

当新的widget并挂到树上时,会调用canUpdate方法,方法中有对key的比较

@immutable
abstract class Widget extends DiagnosticableTree {
  const Widget({ this.key });
  final Key key;
  ···
  static bool canUpdate(Widget oldWidget, Widget newWidget) {
    return oldWidget.runtimeType == newWidget.runtimeType
        && oldWidget.key == newWidget.key;
  }
}
上一篇 下一篇

猜你喜欢

热点阅读