RenderSliverTree<TKey, TData> class

Render object for displaying a tree structure as a sliver.

Uses nodeId-based child storage for straightforward element management.

Implements ReorderRenderPort: the narrow surface TreeReorderController binds to for drag-and-drop (row hit-testing, eviction pinning, FLIP baseline staging, coordinate conversion).

Inheritance
Implemented types

Constructors

RenderSliverTree({required TreeController<TKey, TData> controller, int maxStickyDepth = 0})
Creates a render sliver tree.

Properties

admittedSlideBound → double
The composed slide bound the last performLayout widened its admission window by.
no setter
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 setterinherited
childManager ↔ TreeChildManager<TKey>?
Child manager (the element) that creates/removes children.
getter/setter pair
constraints → SliverConstraints
The layout constraints most recently supplied by the parent.
no setterinherited
controller ↔ TreeController<TKey, TData>
getter/setter pair
crossAxisExtent → double
The tree sliver's cross-axis extent (its band width for a vertical tree), or 0.0 when isLaidOut is false. This is the width rows are laid out against, before their own indent.
no setteroverride
crossAxisGlobalOrigin → double
Global x of the tree sliver's own cross-axis origin, i.e. where sliver-local x = 0 lands on screen, or 0.0 when isLaidOut is false.
no setteroverride
debugBulkCumulativeRebuildCount ↔ int
Lifetime count of _rebuildBulkCumulatives calls. Perf oracle for the bulk-only fast path: a bulk animation whose rows do not change height must build the cumulatives ONCE, not once per frame.
getter/setter pair
debugCanParentUseSize → bool
Whether the parent render object is permitted to use this render object's size.
no setterinherited
debugChildCount → int
Number of mounted child RenderBoxes in _children. Used by parent_data_refresh_iteration_test.dart to assert debugLastParentDataRefreshIterationCount stays bounded by this count.
no setter
debugComposerGhostCount → int
Number of live entries in the slide composer's ghost registry. Forwarded for tests that verify ghost-registry pruning behavior.
no setter
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
debugLastFindRowIterationCount ↔ int
Debug-only: rows examined by the last findRowAtPaintedY call (bounded-scan phases 1 to 3, the full-scan loop length, or the fast path's forward/backward walk). Pins the bounded path's O(window) contract against routing re-widening.
getter/setter pair
debugLastFindRowUsedFullScan ↔ bool
Debug-only: whether the last findRowAtPaintedY call with active composed deltas took the exact full-scan fallback (true) or the bounded window scan (false). Untouched by no-delta fast-path calls.
getter/setter pair
debugLastHitTestIterationCount ↔ int
Phase-2 loop iterations of the last hitTestChildren call. Same bound as debugLastPaintIterationCount, per pointer event.
getter/setter pair
debugLastLayoutUsedBulkAdmission ↔ bool
Debug-only: whether the last layout's cache-region admission ran on the BULK arm, deciding from a BulkAdmissionView over the precomputed cumulatives (true), or on the non-bulk arm, deciding from the per-nid offset and extent slots (false). Both arms run LayoutAdmissionPolicy.admit; this pins which one a test exercised.
getter/setter pair
debugLastPaintedStickyKeys → Set<TKey>
Keys that Pass B ACTUALLY painted this frame.
final
debugLastPaintIterationCount ↔ int
Main-loop iterations of the last paint's Pass A. Bounded by the viewport-intersecting index range (plus or minus the slide overreach), NOT by the total visible count, below-viewport rows must not pay a per-frame sticky check + hash probe each.
getter/setter pair
debugLastParentDataCumulativeBuilds ↔ int
Number of O(N_visible) structural-cumulative builds performed by the off-cache parentData refresh during the last layout. Zero on the common scroll frame (every mounted child in-cache); at most one per layout otherwise. Reset alongside debugLastParentDataRefreshIterationCount.
getter/setter pair
debugLastParentDataRefreshIterationCount ↔ int
Iteration count of the post-sticky parentData refresh loop on the last layout. Reset at the top of performLayout. The loop iterates _children.keys exactly once, so this counter is bounded by _children.length: verified by test/sliver_tree/parent_data_refresh_iteration_test.dart. Diagnostic only; no runtime invariant is enforced by this field.
getter/setter pair
debugLastPhantomGhostPaint → Map<TKey, ({Rect anchorBand, Rect? clipRect, Rect ghostRect})>
Debug-only, paint-time-only capture of each EXIT phantom ghost's painted geometry, the oracle for the far-overhang occlusion tests. Records, per ghost key:
final
debugLastSemanticsIterationCount ↔ int
In-flow loop iterations of the last visitChildrenForSemantics call. Bounded by the mounted-children count, not the visible count.
getter/setter pair
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
debugNeedsSemanticsUpdate → bool
Whether the semantics of this render object is dirty and await the update.
no setterinherited
debugPerformLayoutCount ↔ int
Lifetime count of performLayout invocations. Perf oracle for slide-only paint routing: a pure FLIP slide must lay out only on its install and settle frames.
getter/setter pair
debugPhantomExitGhostCount → int
Number of live entries in _phantomExitGhosts. Exposed for tests that verify phantom-exit cleanup (paint purity, controller swap, per-layout pruning). Zero when the map is null.
no setter
debugSemantics → SemanticsNode?
The semantics of this render object.
no setterinherited
debugSlideBaselineStaged → bool
Whether a FLIP baseline is currently staged and unconsumed. Debug surface for tests pinning the baseline expiry backstop.
no setter
debugSnapshotVisibleOffsetsCount ↔ int
Lifetime count of snapshotVisibleOffsets calls. Perf oracle for the first-wins baseline: K animated mutations in one frame must produce exactly ONE staging snapshot, not K of them, because the slot keeps only the first. The walk is O(visible) with a map entry and a key hash per row, so the discarded ones were the dominant cost of a batched reparent.
getter/setter pair
debugStickyFallbackIterationCount → int
Running count of rows visited by the sticky subtree-bottom fallback walk (L25.3); see StickyHeaderComputer.debugFallbackIterationCount.
no setter
debugStickyHeaders → List<StickyHeaderInfo<TKey>>
The sticky headers computed by the most recent layout, root to leaf. Read-only view for tests that need to assert which rows are pinned and where, rather than inferring it from painted geometry.
no setter
debugStickyOffsetAuthorityMismatchCount ↔ int
Force-created sticky rows whose written parentData.layoutOffset disagreed with the frame's structural authority (_structuralOffsetAt) at the moment of the write. MUST be 0 on every layout: the sticky block writes that authority, and this write is the one place in performLayout that used to read a raw _nodeOffsetsByNid slot for a nid the frame never wrote. Reset at the top of performLayout.
getter/setter pair
debugWrittenCacheRegionNidCount → int
Number of nids in _writtenCacheRegionNids. Exposed for tests that verify the sparse-clear bound is O(viewport), not O(nidCapacity).
no setter
depth → int
The depth of this render object in the render tree.
no setterinherited
ensureSemantics → bool
Whether this sliver should be included in the semantics tree.
no setterinherited
geometry ↔ SliverGeometry?
The amount of space this sliver occupies.
getter/setter pairinherited
hashCode → int
The hash code for this object.
no setterinherited
isLaidOut → bool
Whether the render object has completed at least one layout pass.
no setteroverride
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
maxStickyDepth ↔ int
getter/setter pairoverride-getter
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 setterinherited
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
precedingScrollExtent → double
The scroll extent of all slivers preceding the tree in its viewport, or 0.0 when isLaidOut is false.
no setteroverride
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 setterinherited
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 RenderBox 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.
override
beginSlideBaseline({required Duration duration, required Curve curve, Map<TKey, ({double? x, double y})>? baselineOverrides}) → void
Captures the current painted offsets so the next performLayout can install a FLIP slide from them to the post-mutation offsets.
override
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.
inherited
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.
inherited
childCrossAxisPosition(covariant RenderBox 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.
override
childMainAxisPosition(covariant RenderBox child) → double
Returns the distance from the leading visible edge of the sliver to the side of the given child closest to that edge.
override
childScrollOffset(covariant RenderObject child) → double?
Returns the scroll offset for the leading edge of the given child.
override
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 when asserts are enabled (i.e. in debug mode) and only when needsLayout is false. If the constraints are not met, it should assert or throw an exception.
inherited
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
debugFindRowFullScan(double scrollY) → ({double extent, TKey key, double paintedOffset})?
Test-only oracle access to _findRowFullScan, so equivalence tests can compare the bounded scan's routing result against the exact full-scan answer for the same scrollY with zero drift risk.
debugPaint(PaintingContext context, Offset offset) → void
Override this method to paint debugging information.
inherited
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.
inherited
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.
override
dispose() → void
Release any resources held by this render object.
inherited
drivesController(Object treeController) → bool
Whether this render object is currently driven by treeController (identity comparison).
override
dropChild(RenderObject child) → void
Called by subclasses when they decide a render object is no longer a child.
inherited
findPinnedRowAtPaintedY(double scrollY) → ({double extent, TKey key, double paintedOffset})?
The pinned header whose painted band contains scrollY. See ReorderRenderPort. Scans _sticky.headers shallowest-first (the list is ordered root to leaf) and converts paint space to sliver-local by adding constraints.scrollOffset, the same conversion paintedRowBounds performs. A gesture-time caller, so _sticky holds the last PAINTED frame's values, which is the geometry the user is looking at (see paintedRowBounds).
override
findRowAtPaintedY(double scrollY) → ({double extent, TKey key, double paintedOffset})?
Finds the first live (non-pending-deletion) visible row whose painted scroll-space range [paintedOffset, paintedOffset + extent) contains scrollY, falling back to the last live row when scrollY sits past the bottom of the tree. Returns null when the visible order is empty or every entry is pending-deletion.
override
getAbsoluteSize() → Size
This returns the absolute Size of the sliver.
inherited
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.
inherited
getChildForNode(TKey id) → RenderBox?
Gets the child for the given node ID, or null if not present.
getMaxPaintRect() → Rect
Returns the Rect that covers the total paint extent of the sliver.
inherited
getTransformTo(RenderObject? target) → Matrix4
Applies the paint transform from this RenderObject to the target RenderObject.
inherited
handleEvent(PointerEvent event, covariant SliverHitTestEntry entry) → void
Override this method to handle pointer events that hit this render object.
inherited
hitTest(SliverHitTestResult result, {required double mainAxisPosition, required double crossAxisPosition}) → bool
Determines the set of render objects located at the given position.
inherited
hitTestChildren(SliverHitTestResult result, {required double mainAxisPosition, required double crossAxisPosition}) → bool
Override this method to check whether any children are located at the given position.
override
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.
inherited
insertChild(RenderBox child, TKey nodeId) → void
Inserts a child for the specified node.
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
isNodeRetained(TKey id) → bool
Whether the given node is retained by the current layout, i.e. it is explicitly pinned, in the cache region, a sticky header, or a phantom-exit ghost mid-FLIP. Used by the element to decide whether an off-screen child can be evicted. O(1) (Map containsKey + Set lookup), no allocation.
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
markStructureChanged() → void
Marks the tree structure as changed, clears layout caches, and requests a new layout pass.
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.
override
paintedRowBounds(TKey key) → ({double extent, double paintedOffset})?
Where key is painted, sliver-local. See ReorderRenderPort.
override
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.
override
performResize() → void
Updates the render objects size using only the constraints.
inherited
pinNode(TKey id) → void
Pins id against stale eviction until unpinNode. Idempotent.
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.
override
removeChild(RenderBox child, TKey nodeId) → void
Removes the child for the specified node.
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
resizeScratchArrays(int capacity) → void
Pre-allocates sticky-precompute scratch arrays for capacity nodes. Useful when the tree size is known upfront to avoid incremental resizing.
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.
override
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
snapshotSettledVisibleOffsets() → Map<TKey, ({double x, double y})>
Internal contract: exit-anchor destination resolution only.
snapshotVisibleOffsets() → Map<TKey, ({double x, double y})>
A per-node snapshot of the painted position (in scroll-space) for every visible node. Painted y = structural y + that node's own slide delta.
stageSlideBaseline({required Duration duration, required Curve curve}) → bool
TreeRenderHost entry point: the controller's host registry calls this to stage a FLIP baseline. The render object registers ITSELF on attach and on controller swap, so identity in the registry Set is the render object.
override
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, int wrapWidth = 65}) → 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
trimScratchArrays() → void
Reallocates sticky-precompute scratch arrays to fit the last precomputed count (or empty if zero). Call when the tree shrinks significantly and memory matters.
unpinNode(TKey id) → void
Removes the eviction pin for id. Idempotent.
override
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.
override
visitChildrenForSemantics(RenderObjectVisitor visitor) → void
Filters out children whose nodes have been removed from the controller (or are mid-exit) so screen readers don't announce/focus them while the render boxes wait for their post-frame eviction.
override

Operators

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