RenderObject

作者: 嘛尼嘛哄 | 来源:发表于2020-09-23 00:25 被阅读0次

RenderObject

  1. 继承关系
abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin implements HitTestTarget
  • AbstractNode代表RenderObject在RenderTree中的深度,用- 来管理RenderObject在RenderTree中的位置
  • HitTestTarget: 定义点击事件的抽象接口
  1. reassemble: 主要用于热重载绑定,ext.flutter.reassemble hook
  void reassemble() {
    markNeedsLayout();
    markNeedsCompositingBitsUpdate();
    markNeedsPaint();
    markNeedsSemanticsUpdate();
    visitChildren((RenderObject child) {
      child.reassemble();
    });
  }
  1. setupParentData: 用于传递给child的 layout和position信息
  void setupParentData(covariant RenderObject child) {
    assert(_debugCanPerformMutations);
    if (child.parentData is! ParentData)
      child.parentData = ParentData();
  }
  1. adoptChild: 变更child renderObject
 @override
  void adoptChild(RenderObject child) {
    assert(_debugCanPerformMutations);
    assert(child != null);
//将当前renderObject布局布局
    setupParentData(child);
 //标记需要布局
    markNeedsLayout();
//标记需要重新合成视图
    markNeedsCompositingBitsUpdate();
//更新语意辅助信息
    markNeedsSemanticsUpdate();
//调用abstractNode管理child的位置信息
    super.adoptChild(child);
  }
  1. 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();
  }
  1. 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();
     }
   }
 }
  1. 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);
  }
  1. markNeedsLayoutForSizedByParentChange: 监听sizedByParent变更,同步layout信息
  void markNeedsLayoutForSizedByParentChange() {
    markNeedsLayout();
    markParentNeedsLayout();
  }
  1. _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);
  }
  1. _layoutWithoutResize: 执行布局
void flushLayout() {
        ...
            node._layoutWithoutResize();
  
void _layoutWithoutResize() {
      ...
      performLayout();
      markNeedsSemanticsUpdate();
     ...
    _needsLayout = false;
//布局完成后标记为需要绘制
    markNeedsPaint(); 
  }
  1. layout:
  • 计算当前RenderObject的layout信息
  • 提供了layout的断言检测信息,实际执行的是 performResizeperformLayout,因为有断言检测,子类不要直接重写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();
  }
  1. rotate:
  /// Rotate this render object (not yet implemented).
  void rotate({
    int oldAngle, // 0..3
    int newAngle, // 0..3
    Duration time,
  }) { }
  1. bool get isRepaintBoundary => false;默认跟随父视图变更一起绘制

  2. bool get alwaysNeedsCompositing => false; 控制是否需要重新合成图像,通过markNeedsCompositingBitsUpdate可以标记需要合成

  3. 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)

相关文章

网友评论

    本文标题:RenderObject

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