本次整理一下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;
}
网友评论