美文网首页
2023-03-29 flutter widget更新8-wid

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

作者: 我是小胡胡分胡 | 来源:发表于2023-03-28 16:16 被阅读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;
      }
    

    相关文章

      网友评论

          本文标题:2023-03-29 flutter widget更新8-wid

          本文链接:https://www.haomeiwen.com/subject/evitddtx.html