2023-03-29 flutter widget更新8-wid

2023-03-28  本文已影响0人  我是小胡胡分胡

本次整理一下widget 搭建过程中遇到的一些类和对象。
主要有:Widget,Element,State,RenderObject

1、widget

根Widget构造方法:

RenderObjectToWidgetAdapter<RenderBox>(
     container: renderView,
     debugShortDescription: '[root]',
     child: rootWidget,
   )

普通Widget 构造方法:

runApp(const MyApp());

Widget 有createElement 方法

StatelessElement createElement() => StatelessElement(this);
StatefulElement createElement() => StatefulElement(this);
InheritedElement createElement() => InheritedElement(this);
LeafRenderObjectElement createElement() => LeafRenderObjectElement(this);
SingleChildRenderObjectElement createElement() => SingleChildRenderObjectElement(this);
MultiChildRenderObjectElement createElement() => MultiChildRenderObjectElement(this);
ParentDataElement<T> createElement() => ParentDataElement<T>(this);

RenderObjectElement element类型:

abstract class RootRenderObjectElement extends RenderObjectElement 
class LeafRenderObjectElement extends RenderObjectElement 
class SingleChildRenderObjectElement extends RenderObjectElement
class MultiChildRenderObjectElement extends RenderObjectElement 

StatelessWidget 有build方法
ProxyWidget有child
statefull widget有createState 方法

2、state

State持有element, widget
State有initState方法,build子widget方法

3、element

  StatefulElement(StatefulWidget widget)
      : _state = widget.createState(),
        super(widget) {
 
    state._element = this;
    state._widget = widget;
  }

element持有widget

  Element(Widget widget)
    : assert(widget != null),
      _widget = widget;

  Element? _parent;

element持有state

class StatefulElement extends ComponentElement {
  StatefulElement(StatefulWidget widget)
      : _state = widget.createState(),
        super(widget) {
}
  State<StatefulWidget>? _state;
}

element持有子element

abstract class ComponentElement extends Element {
  ComponentElement(Widget widget) : super(widget);
  Element? _child;

}

element持有renderObject

abstract class RenderObjectElement extends Element {
 RenderObjectElement(RenderObjectWidget widget) : super(widget);
 @override
 RenderObject get renderObject {
   return _renderObject!;
 }
 RenderObject? _renderObject;
}

visit 方法递归调用

abstract class Element extends DiagnosticableTree implements BuildContext {
  Element(Widget widget)
    : assert(widget != null),
      _widget = widget;

  RenderObject? get renderObject {
    RenderObject? result;
    void visit(Element element) {
      if (element._lifecycleState == _ElementLifecycle.defunct) {
        return;
      } else if (element is RenderObjectElement) {
        result = element.renderObject;
      } else {
        element.visitChildren(visit);
      }
    }
    visit(this);
    return result;
  }

}

ComponentElement 实现visitChildren

  void visitChildren(ElementVisitor visitor) {
    if (_child != null)
      visitor(_child!);
  }

class SingleChildRenderObjectElement extends RenderObjectElement 实现:

  void visitChildren(ElementVisitor visitor) {
    if (_child != null)
      visitor(_child!);
  }

class MultiChildRenderObjectElement extends RenderObjectElement实现:

  void visitChildren(ElementVisitor visitor) {
    for (final Element child in _children) {
      if (!_forgottenChildren.contains(child))
        visitor(child);
    }
  }

element 的build方法

  Widget build() => (widget as StatelessWidget).build(this);
  Widget build() => state.build(this);
  Widget build() => (widget as ProxyWidget).child;

widget持有子widget

ProxyWidget

abstract class ProxyWidget extends Widget {
  const ProxyWidget({ Key? key, required this.child }) : super(key: key);
  final Widget child;
}

ProxyWidget子类

abstract class ParentDataWidget<T extends ParentData> extends ProxyWidget
abstract class InheritedWidget extends ProxyWidget 
class NotificationListener<T extends Notification> extends ProxyWidget 

4、RenderObject

abstract class RenderObjectElement extends Element

RenderObjectElement类:

  void mount(Element? parent, Object? newSlot) {
    super.mount(parent, newSlot);
 
    _renderObject = (widget as RenderObjectWidget).createRenderObject(this);
    
    attachRenderObject(newSlot);
    _dirty = false;
  }
上一篇下一篇

猜你喜欢

热点阅读