Incular logoIncular
API ReferenceNavigation & Scrolling

Animated Lists & Grids

Insert and remove rows with retained animations.

AnimatedListController (alias AnimatedGridController, SliverAnimatedGridController) shares insertion/removal state; AnimatedItem snapshots carry stable ids across shifts.

use incular::prelude::*;

fn main() {
    let controller = AnimatedListController::new(3);
    let now = std::time::Instant::now();
    controller.insert(0, now);
    controller.remove_at(1, now);
    println!(
        "items: {}, animating: {}",
        controller.item_count(),
        controller.tick(now)
    );
}
use incular::prelude::*;

fn main() {
    let controller = AnimatedListController::new(3);
    let app = Application::new(move |_cx| {
        Container::builder()
            .padding(EdgeInsets::all(24.0))
            .alignment(Alignment::CENTER)
            .child(
                AnimatedList::new(3, |i| Text::new(format!("row {i}")))
                    .controller(controller.clone()),
            )
            .build()
            .into()
    })
    .expect("valid application");
    incular::run(app).expect("run application");
}

AnimatedItem { id, index, value, phase } with is_incoming() / is_outgoing() / is_stable(); phases: Stable / Incoming / Outgoing. AnimatedItemBuilder / AnimatedRemovedItemBuilder are Rc<dyn Fn…> aliases.

Related: SliverList, SliverGrid.