RenderSliver class abstract

Base class for the render objects that implement scroll effects in viewports.

A RenderViewport has a list of child slivers. Each sliver — literally a slice of the viewport's contents — is laid out in turn, covering the viewport in the process. (Every sliver is laid out each time, including those that have zero extent because they are "scrolled off" or are beyond the end of the viewport.)

Slivers participate in the sliver protocol, wherein during layout each sliver receives a SliverConstraints object and computes a corresponding SliverGeometry that describes where it fits in the viewport. This is analogous to the box protocol used by RenderBox, which gets a BoxConstraints as input and computes a Size.

Slivers have a leading edge, which is where the position described by SliverConstraints.scrollOffset for this sliver begins. Slivers have several dimensions, the primary of which is SliverGeometry.paintExtent, which describes the extent of the sliver along the main axis, starting from the leading edge, reaching either the end of the viewport or the end of the sliver, whichever comes first.

Slivers can change dimensions based on the changing constraints in a non-linear fashion, to achieve various scroll effects. For example, the various RenderSliverPersistentHeader subclasses, on which SliverAppBar is based, achieve effects such as staying visible despite the scroll offset, or reappearing at different offsets based on the user's scroll direction (SliverConstraints.userScrollDirection).

Writing a RenderSliver subclass

Slivers can have sliver children, or children from another coordinate system, typically box children. (For details on the box protocol, see RenderBox.) Slivers can also have different child models, typically having either one child, or a list of children.

Examples of slivers

A good example of a sliver with a single child that is also itself a sliver is RenderSliverPadding, which indents its child. A sliver-to-sliver render object such as this must construct a SliverConstraints object for its child, then must take its child's SliverGeometry and use it to form its own geometry.

The other common kind of one-child sliver is a sliver that has a single RenderBox child. An example of that would be RenderSliverToBoxAdapter, which lays out a single box and sizes itself around the box. Such a sliver must use its SliverConstraints to create a BoxConstraints for the child, lay the child out (using the child's layout method), and then use the child's RenderBox.size to generate the sliver's SliverGeometry.

The most common kind of sliver though is one with multiple children. The most straight-forward example of this is RenderSliverList, which arranges its children one after the other in the main axis direction. As with the one-box-child sliver case, it uses its constraints to create a BoxConstraints for the children, and then it uses the aggregate information from all its children to generate its geometry. Unlike the one-child cases, however, it is judicious in which children it actually lays out (and later paints). If the scroll offset is 1000 pixels, and it previously determined that the first three children are each 400 pixels tall, then it will skip the first two and start the layout with its third child.

Layout

As they are laid out, slivers decide their geometry, which includes their size (SliverGeometry.paintExtent) and the position of the next sliver (SliverGeometry.layoutExtent), as well as the position of each of their children, based on the input constraints from the viewport such as the scroll offset (SliverConstraints.scrollOffset).

For example, a sliver that just paints a box 100 pixels high would say its SliverGeometry.paintExtent was 100 pixels when the scroll offset was zero, but would say its SliverGeometry.paintExtent was 25 pixels when the scroll offset was 75 pixels, and would say it was zero when the scroll offset was 100 pixels or more. (This is assuming that SliverConstraints.remainingPaintExtent was more than 100 pixels.)

The various dimensions that are provided as input to this system are in the constraints. They are described in detail in the documentation for the SliverConstraints class.

The performLayout function must take these constraints and create a SliverGeometry object that it must then assign to the geometry property. The different dimensions of the geometry that can be configured are described in detail in the documentation for the SliverGeometry class.

Painting

In addition to implementing layout, a sliver must also implement painting. This is achieved by overriding the paint method.

The paint method is called with an Offset from the Canvas origin to the top-left corner of the sliver, regardless of the axis direction.

Subclasses should also override applyPaintTransform to provide the Matrix4 describing the position of each child relative to the sliver. (This is used by, among other things, the accessibility layer, to determine the bounds of the child.)

Hit testing

To implement hit testing, either override the hitTestSelf and hitTestChildren methods, or, for more complex cases, instead override the hitTest method directly.

To actually react to pointer events, the handleEvent method may be implemented. By default it does nothing. (Typically gestures are handled by widgets in the box protocol, not by slivers directly.)

Helper methods

There are a number of methods that a sliver should implement which will make the other methods easier to implement. Each method listed below has detailed documentation. In addition, the RenderSliverHelpers class can be used to mix in some helpful methods.

childScrollOffset

If the subclass positions children anywhere other than at scroll offset zero, it should override childScrollOffset. For example, RenderSliverList and RenderSliverGrid override this method, but RenderSliverToBoxAdapter does not.

This is used by, among other things, Scrollable.ensureVisible.

childMainAxisPosition

Subclasses should implement childMainAxisPosition to describe where their children are positioned.

childCrossAxisPosition

If the subclass positions children in the cross-axis at a position other than zero, then it should override childCrossAxisPosition. For example RenderSliverGrid overrides this method.

Inheritance
Implementers

Constructors

RenderSliver()

Properties

alwaysNeedsCompositing bool
Whether this render object always needs compositing.
no setterinherited
attached bool
Whether the render tree this render object belongs to is attached to a PipelineOwner.
no setterinherited
centerOffsetAdjustment double
For a center sliver, the distance before the absolute zero scroll offset that this sliver can cover.
no setter
constraints SliverConstraints
The layout constraints most recently supplied by the parent.
no setteroverride
debugCanParentUseSize bool
Whether the parent render object is permitted to use this render object's size.
no setterinherited
debugCreator Object?
The object responsible for creating this render object.
getter/setter pairinherited
debugDisposed bool?
Whether this has been disposed.
no setterinherited
debugDoingThisLayout bool
Whether performLayout for this render object is currently running.
no setterinherited
debugDoingThisLayoutWithCallback bool
Whether invokeLayoutCallback for this render object is currently running.
no setterinherited
debugDoingThisPaint bool
Whether paint for this render object is currently running.
no setterinherited
debugDoingThisResize bool
Whether performResize for this render object is currently running.
no setterinherited
debugLayer ContainerLayer?
In debug mode, the compositing layer that this render object uses to repaint.
no setterinherited
debugLayoutParent RenderObject?
The RenderObject that's expected to call layout on this RenderObject in its performLayout implementation.
no setterinherited
debugNeedsCompositedLayerUpdate bool
Whether this render object's layer information is dirty.
no setterinherited
debugNeedsLayout bool
Whether this render object's layout information is dirty.
no setterinherited
debugNeedsPaint bool
Whether this render object's paint information is dirty.
no setterinherited
debugSemantics SemanticsNode?
The semantics of this render object.
no setterinherited
depth int
The depth of this render object in the render tree.
no setterinherited
geometry SliverGeometry?
The amount of space this sliver occupies.
getter/setter pair
hashCode int
The hash code for this object.
no setterinherited
isRepaintBoundary bool
Whether this render object repaints separately from its parent.
no setterinherited
layer ContainerLayer?
The compositing layer that this render object uses to repaint.
getter/setter pairinherited
needsCompositing bool
Whether we or one of our descendants has a compositing layer.
no setterinherited
owner PipelineOwner?
The owner for this render object (null if unattached).
no setterinherited
paintBounds Rect
An estimate of the bounds within which this render object will paint. Useful for debugging flags such as debugPaintLayerBordersEnabled.
no setteroverride
parent RenderObject?
The parent of this render object in the render tree.
no setterinherited
parentData ParentData?
Data for use by the parent render object.
getter/setter pairinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited
semanticBounds Rect
The bounding box, in the local coordinate system, of this object, for accessibility purposes.
no setteroverride
sizedByParent bool
Whether the constraints are the only input to the sizing algorithm (in particular, child nodes have no impact).
no setterinherited

Methods

adoptChild(RenderObject child) → void
Called by subclasses when they decide a render object is a child.
inherited
applyPaintTransform(covariant RenderObject child, Matrix4 transform) → void
Applies the transform that would be applied when painting the given child to the given matrix.
override
assembleSemanticsNode(SemanticsNode node, SemanticsConfiguration config, Iterable<SemanticsNode> children) → void
Assemble the SemanticsNode for this RenderObject.
inherited
attach(PipelineOwner owner) → void
Mark this render object as attached to the given owner.
inherited
calculateCacheOffset(SliverConstraints constraints, {required double from, required double to}) double
Computes the portion of the region from from to to that is within the cache extent of the viewport, assuming that only the region from the SliverConstraints.cacheOrigin that is SliverConstraints.remainingCacheExtent high is visible, and that the relationship between scroll offsets and paint offsets is linear.
calculatePaintOffset(SliverConstraints constraints, {required double from, required double to}) double
Computes the portion of the region from from to to that is visible, assuming that only the region from the SliverConstraints.scrollOffset that is SliverConstraints.remainingPaintExtent high is visible, and that the relationship between scroll offsets and paint offsets is linear.
childCrossAxisPosition(covariant RenderObject child) double
Returns the distance along the cross axis from the zero of the cross axis in this sliver's paint coordinate space to the nearest side of the given child.
childMainAxisPosition(covariant RenderObject child) double
Returns the distance from the leading visible edge of the sliver to the side of the given child closest to that edge.
childScrollOffset(covariant RenderObject child) double?
Returns the scroll offset for the leading edge of the given child.
clearSemantics() → void
Removes all semantics from this render object and its descendants.
inherited
debugAssertDoesMeetConstraints() → void
Verify that the object's constraints are being met. Override this function in a subclass to verify that your state matches the constraints object. This function is only called in checked mode and only when needsLayout is false. If the constraints are not met, it should assert or throw an exception.
override
debugDescribeChildren() List<DiagnosticsNode>
Returns a list of DiagnosticsNode objects describing this node's children.
inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
Add additional properties associated with the node.
override
debugPaint(PaintingContext context, Offset offset) → void
Override this method to paint debugging information.
override
debugRegisterRepaintBoundaryPaint({bool includedParent = true, bool includedChild = false}) → void
Called, in debug mode, if isRepaintBoundary is true, when either the this render object or its parent attempt to paint.
inherited
debugResetSize() → void
If a subclass has a "size" (the state controlled by parentUsesSize, whatever it is in the subclass, e.g. the actual size property of RenderBox), and the subclass verifies that in debug mode this "size" property isn't used when debugCanParentUseSize isn't set, then that subclass should override debugResetSize to reapply the current values of debugCanParentUseSize to that state.
override
describeApproximatePaintClip(covariant RenderObject child) Rect?
Returns a rect in this object's coordinate system that describes the approximate bounding box of the clip rect that would be applied to the given child during the paint phase, if any.
inherited
describeForError(String name, {DiagnosticsTreeStyle style = DiagnosticsTreeStyle.shallow}) DiagnosticsNode
Adds a debug representation of a RenderObject optimized for including in error messages.
inherited
describeSemanticsClip(covariant RenderObject? child) Rect?
Returns a rect in this object's coordinate system that describes which SemanticsNodes produced by the child should be included in the semantics tree. SemanticsNodes from the child that are positioned outside of this rect will be dropped. Child SemanticsNodes that are positioned inside this rect, but outside of describeApproximatePaintClip will be included in the tree marked as hidden. Child SemanticsNodes that are inside of both rect will be included in the tree as regular nodes.
inherited
describeSemanticsConfiguration(SemanticsConfiguration config) → void
Report the semantics of this node, for example for accessibility purposes.
inherited
detach() → void
Mark this render object as detached from its PipelineOwner.
inherited
dispose() → void
Release any resources held by this render object.
inherited
dropChild(RenderObject child) → void
Called by subclasses when they decide a render object is no longer a child.
inherited
getAbsoluteSize() Size
This returns the absolute Size of the sliver.
getAbsoluteSizeRelativeToOrigin() Size
This returns a Size with dimensions relative to the leading edge of the sliver, specifically the same offset that is given to the paint method. This means that the dimensions may be negative.
getTransformTo(RenderObject? ancestor) Matrix4
Applies the paint transform up the tree to ancestor.
inherited
handleEvent(PointerEvent event, covariant SliverHitTestEntry entry) → void
Override this method to handle pointer events that hit this render object.
override
hitTest(SliverHitTestResult result, {required double mainAxisPosition, required double crossAxisPosition}) bool
Determines the set of render objects located at the given position.
hitTestChildren(SliverHitTestResult result, {required double mainAxisPosition, required double crossAxisPosition}) bool
Override this method to check whether any children are located at the given position.
hitTestSelf({required double mainAxisPosition, required double crossAxisPosition}) bool
Override this method if this render object can be hit even if its children were not hit.
invokeLayoutCallback<T extends Constraints>(LayoutCallback<T> callback) → void
Allows mutations to be made to this object's child list (and any descendants) as well as to any other dirty nodes in the render tree owned by the same PipelineOwner as this object. The callback argument is invoked synchronously, and the mutations are allowed only during that callback's execution.
inherited
layout(Constraints constraints, {bool parentUsesSize = false}) → void
Compute the layout for this render object.
inherited
markNeedsCompositedLayerUpdate() → void
Mark this render object as having changed a property on its composited layer.
inherited
markNeedsCompositingBitsUpdate() → void
Mark the compositing state for this render object as dirty.
inherited
markNeedsLayout() → void
Mark this render object's layout information as dirty, and either register this object with its PipelineOwner, or defer to the parent, depending on whether this object is a relayout boundary or not respectively.
inherited
markNeedsLayoutForSizedByParentChange() → void
Mark this render object's layout information as dirty (like markNeedsLayout), and additionally also handle any necessary work to handle the case where sizedByParent has changed value.
inherited
markNeedsPaint() → void
Mark this render object as having changed its visual appearance.
inherited
markNeedsSemanticsUpdate() → void
Mark this node as needing an update to its semantics description.
inherited
markParentNeedsLayout() → void
Mark this render object's layout information as dirty, and then defer to the parent.
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
paint(PaintingContext context, Offset offset) → void
Paint this render object into the given context at the given offset.
inherited
paintsChild(covariant RenderObject child) bool
Whether the given child would be painted if paint were called.
inherited
performLayout() → void
Do the work of computing the layout for this render object.
inherited
performResize() → void
Updates the render objects size using only the constraints.
override
reassemble() → void
Cause the entire subtree rooted at the given RenderObject to be marked dirty for layout, paint, etc, so that the effects of a hot reload can be seen, or so that the effect of changing a global debug flag (such as debugPaintSizeEnabled) can be applied.
inherited
redepthChild(RenderObject child) → void
Adjust the depth of the given child to be greater than this node's own depth.
inherited
redepthChildren() → void
Adjust the depth of this node's children, if any.
inherited
replaceRootLayer(OffsetLayer rootLayer) → void
Replace the layer. This is only valid for the root of a render object subtree (whatever object scheduleInitialPaint was called on).
inherited
scheduleInitialLayout() → void
Bootstrap the rendering pipeline by scheduling the very first layout.
inherited
scheduleInitialPaint(ContainerLayer rootLayer) → void
Bootstrap the rendering pipeline by scheduling the very first paint.
inherited
scheduleInitialSemantics() → void
Bootstrap the semantics reporting mechanism by marking this node as needing a semantics update.
inherited
sendSemanticsEvent(SemanticsEvent semanticsEvent) → void
Sends a SemanticsEvent associated with this render object's SemanticsNode.
inherited
setupParentData(covariant RenderObject child) → void
Override to setup parent data correctly for your children.
inherited
showOnScreen({RenderObject? descendant, Rect? rect, Duration duration = Duration.zero, Curve curve = Curves.ease}) → void
Attempt to make (a portion of) this or a descendant RenderObject visible on screen.
inherited
toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) DiagnosticsNode
Returns a debug representation of the object that is used by debugging tools and by DiagnosticsNode.toStringDeep.
inherited
toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) String
A string representation of this object.
inherited
toStringDeep({String prefixLineOne = '', String? prefixOtherLines = '', DiagnosticLevel minLevel = DiagnosticLevel.debug}) String
Returns a description of the tree rooted at this node. If the prefix argument is provided, then every line in the output will be prefixed by that string.
inherited
toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) String
Returns a one-line detailed description of the render object. This description is often somewhat long.
inherited
toStringShort() String
Returns a human understandable name.
inherited
updateCompositedLayer({required covariant OffsetLayer? oldLayer}) OffsetLayer
Update the composited layer owned by this render object.
inherited
visitChildren(RenderObjectVisitor visitor) → void
Calls visitor for each immediate child of this render object.
inherited
visitChildrenForSemantics(RenderObjectVisitor visitor) → void
Called when collecting the semantics of this node.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited