RenderObject
2020-09-23 本文已影响0人
嘛尼嘛哄
RenderObject
- 继承关系
abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin implements HitTestTarget
-
AbstractNode
代表RenderObject
在RenderTree中的深度,用- 来管理RenderObject在RenderTree中的位置 - HitTestTarget: 定义点击事件的抽象接口
- reassemble: 主要用于热重载绑定,
ext.flutter.reassemble
hook
void reassemble() {
markNeedsLayout();
markNeedsCompositingBitsUpdate();
markNeedsPaint();
markNeedsSemanticsUpdate();
visitChildren((RenderObject child) {
child.reassemble();
});
}
- setupParentData: 用于传递给child的 layout和position信息
void setupParentData(covariant RenderObject child) {
assert(_debugCanPerformMutations);
if (child.parentData is! ParentData)
child.parentData = ParentData();
}
- adoptChild: 变更child renderObject
@override
void adoptChild(RenderObject child) {
assert(_debugCanPerformMutations);
assert(child != null);
//将当前renderObject布局布局
setupParentData(child);
//标记需要布局
markNeedsLayout();
//标记需要重新合成视图
markNeedsCompositingBitsUpdate();
//更新语意辅助信息
markNeedsSemanticsUpdate();
//调用abstractNode管理child的位置信息
super.adoptChild(child);
}
- dropChild:移除child renderObject
@override
void dropChild(RenderObject child) {
assert(_debugCanPerformMutations);
assert(child != null);
assert(child.parentData != null);
child._cleanRelayoutBoundary();
child.parentData.detach();
child.parentData = null;
//从结点中移除
super.dropChild(child);
//标记,用于下一帧的绘制,同上
markNeedsLayout();
markNeedsCompositingBitsUpdate();
markNeedsSemanticsUpdate();
}
- markNeedsLayout: 标记当前RenderObject需要进行布局计算
void markNeedsLayout() {
...
if (_relayoutBoundary != this) {
markParentNeedsLayout();
} else {
_needsLayout = true;
if (owner != null) {
...
//将当前结点的RenderObject添加到 PipelineOwner({
的pipeline中
owner._nodesNeedingLayout.add(this);
//请求flutter engine更新视图
owner.requestVisualUpdate();
}
}
}
- markParentNeedsLayout: 同步parent的layout信息
@protected
void markParentNeedsLayout() {
_needsLayout = true;
final RenderObject parent = this.parent as RenderObject;
if (!_doingThisLayoutWithCallback) {
parent.markNeedsLayout();
} else {
assert(parent._debugDoingThisLayout);
}
assert(parent == this.parent);
}
- markNeedsLayoutForSizedByParentChange: 监听sizedByParent变更,同步layout信息
void markNeedsLayoutForSizedByParentChange() {
markNeedsLayout();
markParentNeedsLayout();
}
- _cleanRelayoutBoundary:
void _cleanRelayoutBoundary() {
if (_relayoutBoundary != this) {
_relayoutBoundary = null;
_needsLayout = true;
visitChildren(_cleanChildRelayoutBoundary);
}
}
10.用于根视图 RenderView初始化布局
void scheduleInitialLayout() {
assert(attached);
assert(parent is! RenderObject);
assert(!owner._debugDoingLayout);
assert(_relayoutBoundary == null);
_relayoutBoundary = this;
assert(() {
_debugCanParentUseSize = false;
return true;
}());
owner._nodesNeedingLayout.add(this);
}
- _layoutWithoutResize: 执行布局
void flushLayout() {
...
node._layoutWithoutResize();
void _layoutWithoutResize() {
...
performLayout();
markNeedsSemanticsUpdate();
...
_needsLayout = false;
//布局完成后标记为需要绘制
markNeedsPaint();
}
- layout:
- 计算当前
RenderObject
的layout信息 - 提供了layout的断言检测信息,实际执行的是
performResize
和performLayout
,因为有断言检测,子类不要直接重写layout - parentUsesSize: 此参数代表子类布局变化时是否需要更细父类的布局
void layout(Constraints constraints, { bool parentUsesSize = false }) {
assert(constraints != null);
assert(constraints.debugAssertIsValid(...
assert(!_debugDoingThisResize);
assert(!_debugDoingThisLayout);
RenderObject relayoutBoundary;
if (!parentUsesSize || sizedByParent || constraints.isTight || parent is! RenderObject) {
relayoutBoundary = this;
} else {
relayoutBoundary = (parent as RenderObject)._relayoutBoundary;
..
if (!_needsLayout && constraints == _constraints && relayoutBoundary == _relayoutBoundary) {
...
return;
}
_constraints = constraints;
if (_relayoutBoundary != null && relayoutBoundary != _relayoutBoundary) {
//通知子视图更新relayoutboundary
visitChildren(_cleanChildRelayoutBoundary);
}
_relayoutBoundary = relayoutBoundary;
...
return true;
}());
if (sizedByParent) {
...子视图随父视图改变
performResize();
...
try {
//子类执行layout最终的布局
performLayout();
markNeedsSemanticsUpdate();
...
_needsLayout = false;
markNeedsPaint();
}
- rotate:
/// Rotate this render object (not yet implemented).
void rotate({
int oldAngle, // 0..3
int newAngle, // 0..3
Duration time,
}) { }
-
bool get isRepaintBoundary => false;
默认跟随父视图变更一起绘制 -
bool get alwaysNeedsCompositing => false; 控制是否需要重新合成图像,通过
markNeedsCompositingBitsUpdate
可以标记需要合成 -
layer:
- 此渲染对象用于重新绘制的合成层。
- 如果renderObject不是一个重新绘制的边界,paint方法将会填充它
- needsCompositing时保留该layer可以节省性能开销
- 如果renderObject是一个重新绘制的边界,将会创建一个OffsetLayer并调用paint方法绘制
@protected
ContainerLayer get layer {
assert(!isRepaintBoundary || (_layer == null || _layer is OffsetLayer));
return _layer;
}
小结
负责布局和绘制,通过parentData提供子结点所需要布局信息,向下逐步级传,完成布局后,提交绘制指令. 与element略有不同,他没有直接与child关联,而是通过parentData来协调子类的布局,最终会形成一个层叠的RenderObject,布局完成后,标记为绘制.
RenderObject家族
AbstractNode (node.dart)
RenderObject (object.dart)
RenderBox (box.dart)
RenderShiftedBox (shifted_box.dart)
RenderStack (stack.dart)
RenderCustomMultiChildLayoutBox (custom_layout.dart)
RenderProxyBoxMixin (proxy_box.dart)
RenderProxyBox (proxy_box.dart)
RenderEditable (editable.dart)
RenderErrorBox (error.dart)
RenderFlex (flex.dart)
RenderFlow (flow.dart)
RenderImage (image.dart)
RenderListBody (list_body.dart)
RenderListWheelViewport (list_wheel_viewport.dart)
RenderViewportBase (viewport.dart)
RenderParagraph (paragraph.dart)
RenderPerformanceOverlay (performance_overlay.dart)
RenderUiKitView (platform_view.dart)
_PlatformViewGestureMixin (platform_view.dart)
PlatformViewRenderBox (platform_view.dart)
RenderAndroidView (platform_view.dart)
RenderRotatedBox (rotated_box.dart)
RenderTable (table.dart)
TextureBox (texture.dart)
RenderWrap (wrap.dart)
_RenderTheatre (overlay.dart)
_RenderInspectorOverlay (widget_inspector.dart)
_RenderLayoutBuilder (layout_builder.dart)
_RenderSingleChildViewport (single_child_scroll_view.dart)
_RenderCupertinoAlertActions (action_sheet.dart)
_RenderCupertinoAlert (action_sheet.dart)
_RenderCupertinoDialogActions (dialog.dart)
_RenderCupertinoDialog (dialog.dart)
_RenderSegmentedControl (segmented_control.dart)
_RenderSegmentedControl (sliding_segmented_control.dart)
_RenderDecoration (input_decorator.dart)
_RenderListTile (list_tile.dart)
_RenderChip (chip.dart)
_TextSelectionToolbarItemsRenderBox (text_selection.dart)
_RenderRangeSlider (range_slider.dart)
_RenderSlider (slider.dart)
RenderView (view.dart)
DebugOverflowIndicatorMixin (debug_overflow_indicator.dart)
RenderUnconstrainedBox (shifted_box.dart)
RenderFlex (flex.dart)
RenderAbstractViewport (viewport.dart)
RenderListWheelViewport (list_wheel_viewport.dart)
_RenderSingleChildViewport (single_child_scroll_view.dart)
RenderViewportBase (viewport.dart)
RenderSliver (sliver.dart)
RenderProxySliver (proxy_sliver.dart)
RenderSliverWithKeepAliveMixin (sliver_multi_box_adaptor.dart)
RenderSliverMultiBoxAdaptor (sliver_multi_box_adaptor.dart)
RenderSliverEdgeInsetsPadding (sliver_padding.dart)
RenderSliverPersistentHeader (sliver_persistent_header.dart)
RenderSliverOverlapInjector (nested_scroll_view.dart)
RenderSliverOverlapAbsorber (nested_scroll_view.dart)
_RenderSliverLayoutBuilder (sliver_layout_builder.dart)
_RenderCupertinoSliverRefresh (refresh.dart)
RenderSliverHelpers (sliver.dart)
RenderSliverSingleBoxAdapter (sliver.dart)
RenderObjectWithChildMixin (object.dart)
RenderView (view.dart)
RenderShiftedBox (shifted_box.dart)
RenderAnimatedOpacityMixin (proxy_box.dart)
RenderProxyBox (proxy_box.dart)
RenderProxyBoxMixin (proxy_box.dart)
RenderSliverSingleBoxAdapter (sliver.dart)
RenderProxySliver (proxy_sliver.dart)
RenderRotatedBox (rotated_box.dart)
RenderSliverEdgeInsetsPadding (sliver_padding.dart)
RenderSliverPersistentHeader (sliver_persistent_header.dart)
RenderConstrainedLayoutBuilder (layout_builder.dart)
_RenderLayoutBuilder (layout_builder.dart)
RenderSliverOverlapAbsorber (nested_scroll_view.dart)
_RenderSingleChildViewport (single_child_scroll_view.dart)
_RenderSliverLayoutBuilder (sliver_layout_builder.dart)
_RenderCupertinoSliverRefresh (refresh.dart)
ContainerRenderObjectMixin (object.dart)
RenderBoxContainerDefaultsMixin (box.dart)
RenderStack (stack.dart)
RenderCustomMultiChildLayoutBox (custom_layout.dart)
RenderFlex (flex.dart)
RenderFlow (flow.dart)
RenderListBody (list_body.dart)
RenderListWheelViewport (list_wheel_viewport.dart)
RenderViewportBase (viewport.dart)
RenderParagraph (paragraph.dart)
RenderSliverMultiBoxAdaptor (sliver_multi_box_adaptor.dart)
RenderWrap (wrap.dart)
_RenderTheatre (overlay.dart)
_RenderCupertinoAlertActions (action_sheet.dart)
_RenderCupertinoDialogActions (dialog.dart)
_RenderSegmentedControl (segmented_control.dart)
_RenderSegmentedControl (sliding_segmented_control.dart)
_TextSelectionToolbarItemsRenderBox (text_selection.dart)
RelayoutWhenSystemFontsChangeMixin (object.dart)
RenderEditable (editable.dart)
RenderParagraph (paragraph.dart)
_RenderRangeSlider (range_slider.dart)
_RenderSlider (slider.dart)