LazyColumn

LazyColumn is the virtualized list primitive in Fission.
It is designed for long vertical lists where building every item on every frame would be wasteful. Instead of lowering the entire list, it lowers only the visible slice plus spacer regions above and below that slice.
Use LazyColumn when you have many items with a uniform item height. Do not use it for short lists, highly irregular item heights, or one-off scrollable forms. In those cases, a normal Scroll containing a Column is usually simpler.

Example

use fission::prelude::*;
use std::sync::Arc;

let widget: Widget = LazyColumn {
    children: Arc::new(
        (0..500)
            .map(|i| Text::new(format!("Row {i}")).into())
            .collect(),
    ),
    item_height: 40.0,
    ..Default::default()
}
.into();

Field table

Field
Type
Meaning
Notes / default behavior
id
Option<WidgetId>
Stable widget identity used for scroll tracking.
Defaults to None.
children
Vec<Widget>
All list items.
Required. Only the visible slice is lowered each frame when virtualization is active.
item_height
f32
Uniform height for each item.
Required for virtualization. If item_height <= 0.0, virtualization is disabled.

How it differs from Scroll

A Scroll always lowers its entire child subtree. A LazyColumn lowers only the visible range of items and represents the rest with spacer boxes.
That makes LazyColumn the right choice for large lists, but only when the list can honestly be treated as uniform-height rows. If your items vary greatly in height, the simplification that makes virtualization efficient also makes it less accurate.

Specific advice

Be realistic about item_height. If the value is wrong, scroll math and perceived visibility can feel off. For lists with mixed content heights, prefer a normal scroll container until the framework offers a list model that matches that complexity.
Another important detail is that LazyColumn already owns vertical scrolling. Do not wrap it in another vertical Scroll unless you intentionally want nested scrolling behavior.

Production checklist

For LazyColumn, review the fields that change behavior before treating the widget as finished: id, children, item_height. The goal is to make the product rule visible in state and actions, not hidden inside ad-hoc construction code.
If this widget appears inside an interactive flow, keep the surrounding action binding in the parent component and test that the flow still has one clear reducer path.
When child widgets are generated from data, give reordered or filtered rows an explicit WidgetId so retained local state and scroll behavior do not drift between items.
Set id only when identity must be stable across filtering, reordering, diagnostics, or tests; otherwise let Fission derive identity from structure.
Check the semantics tree for the user-facing label or role that makes this widget understandable without relying only on pixels.
Add at least one component or harness test that confirms the visible text, semantic role, action dispatch, and layout constraint that matter for this widget in context.
If a screen starts repeating the same LazyColumn setup, extract a named component around this widget. That keeps the reference API small while making product code easier to read and safer for generated code to copy.
Scroll, Column, and Spacer.
Fission
A cross-platform, GPU-accelerated user interface framework for Rust. MIT licensed.
Copyright (c) 2026 Fission
Ready to use today. Widget APIs are expected to remain stable; some runtime and shell APIs may change before 1.0.0.
Fission 0.7.0