BloomVirtualizer class

Reactive list virtualization engine wrapping vendored @tanstack/virtual-core.

Restricts DOM rendering to only the items currently inside the visible viewport (plus an overscan margin), maintaining constant DOM memory and layout performance regardless of list size.

Required Lifecycle & Call Order

  1. Construct: Instantiate BloomVirtualizer with a scrollElementRef, count, and estimateSize.
  2. Attach on Mount: In a Mount or RefNode onMount callback, call attach. The container DOM element must already be mounted in the document.
  3. Refresh on Change: Call refresh whenever the collection changes or count updates. Note: Calling refresh before the element is attached will throw.
  4. Dispose on Unmount: Call dispose in onUnmount to release scroll and resize observers.

Example

final scrollRef = Ref<web.Element>();
final virtualizer = BloomVirtualizer(
  scrollElementRef: scrollRef,
  count: () => products.length,
  estimateSize: (index) => 64.0,
  overscan: 5,
);

RefNode(
  scrollRef,
  Mount(
    Div(
      style: 'height: 400px; overflow-y: auto; position: relative;',
      children: [
        Live(() => Div(
          style: 'height: ${virtualizer.totalSize.value}px; position: relative; width: 100%;',
          children: virtualizer.items.value.map((item) {
            final product = products[item.index];
            return Div(
              style: 'position: absolute; top: 0; left: 0; width: 100%; '
                     'height: ${item.size}px; transform: translateY(${item.start}px);',
              text: product.name,
            );
          }).toList(),
        )),
      ],
    ),
    onMount: virtualizer.attach,
    onUnmount: virtualizer.dispose,
  ),
);

Constructors

BloomVirtualizer({required Ref<Element> scrollElementRef, required int count(), required double estimateSize(int index), int overscan = 5, double gap = 0})
Creates a BloomVirtualizer configured with the specified scrolling container and sizing options.

Properties

count → int Function()
Callback returning the total number of items in the full dataset.
final
estimateSize → double Function(int index)
Callback estimating the height in pixels of an item at index.
final
gap → double
Fixed gap in pixels between consecutive items. Defaults to 0.
final
hashCode → int
The hash code for this object.
no setterinherited
items → Signal<List<BloomVirtualItem>>
Reactive signal containing the list of BloomVirtualItems currently in the visible window.
final
overscan → int
Number of extra items rendered above and below the visible viewport. Defaults to 5.
final
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
scrollElementRef → Ref<Element>
Reference to the scrollable container DOM element (overflow-y: auto).
final
totalSize → Signal<double>
Reactive signal containing the total estimated scrollable height in pixels.
final

Methods

attach() → void
Connects scroll and resize observers to scrollElementRef and performs the initial measurement pass.
dispose() → void
Disconnects scroll and resize observers and releases internal JS resources.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
refresh() → void
Recomputes virtual window layout after count or dataset dimensions change.
toString() → String
A string representation of this object.
inherited

Operators

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