Search packages, repositories and app categories

Package detailsv1.2.1

lazy_load_indexed_stack

A package that extends IndexedStack to allow for lazy loading.

AndroidiOSWebmacOSWindowsLinux
30-day downloads
13.4K
Likes
101
Pub points
160

Install package

flutter pub add lazy_load_indexed_stack

Package Overview

Package selection guidance compiled from public package information, community data, and project usage.

A Flutter package that extends IndexedStack to enable lazy loading of its children. It ensures that only the currently visible widget is built and rendered, improving performance for apps with multiple pages or heavy widgets. Ideal for tabbed interfaces or navigation where each tab contains complex content. The package efficiently manages memory by deferring widget creation until needed, reducing initial load time and resource usage.

Use cases

  • Tabbed interfaces with heavy content
  • Performance optimization in multi-page layouts
  • Reducing initial app load time
  • Dynamic content switching
  • Memory-efficient navigation
  • Lazy rendering of complex widgets

Key features

  • Extends IndexedStack
  • Lazy loading of children
  • On-demand widget creation
  • Improved performance
  • Memory efficiency
  • Simple integration

Suitable for

  • Developers optimizing app performance
  • Apps with multiple tabs or screens
  • Complex UIs requiring efficient rendering
  • Projects using IndexedStack
  • Teams focused on resource management

Considerations

  • Limited to child widgets within IndexedStack
  • May require careful state management
  • Not suitable for immediate rendering needs
  • Best used with predictable navigation patterns
  • Requires understanding of widget lifecycle

Original README

Original README snapshot from the linked source repository. Visit the repository for the latest content.

CI Pub

lazy_load_indexed_stack

A package that extends IndexedStack to allow for lazy loading and provides enhanced control for reloading specific child widgets.

Motivation

If you use the IndexedStack with bottom navigation, all the widgets specified in the children of the IndexedStack will be built.

Moreover, if the widget requires API requests or database access, or has a complex UI, the IndexedStack build time will be significant.

Therefore, we created an extended IndexedStack that builds the required widget only when it is needed and returns the pre-built widget when it is needed again.

Features

  • Lazy Loading: The main feature of LazyLoadIndexedStack is to build children widgets only when they are needed, reducing initial load time.
  • Preloading: With the preloadIndexes parameter, you can specify indexes of children that should be built in advance, even if they are not currently visible. This is useful for preloading widgets that are likely to be needed soon.
  • Auto Disposal: The autoDisposeIndexes parameter allows specific children to be automatically disposed of when they are no longer visible. When these children are accessed again, they will be rebuilt from scratch. This is useful for cases where widgets hold significant state or require resetting when revisited.

Usage

You can use LazyLoadIndexedStack in the same way as IndexedStack, with additional options for preloading and auto dispose. If an index is included in both preloadIndexes and autoDisposeIndexes, it will be preloaded initially but disposed when it becomes invisible and rebuilt when accessed again.

Basic Example
class MainPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  int _index = 0;

  @override
  Widget build(final BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: LazyLoadIndexedStack(
          index: _index,
          preloadIndexes: [1, 2],
          autoDisposeIndexes: [2, 3],
          children: [
            Page1(), // Load by initial index
            Page2(), // Preloaded initially
            Page3(), // Preloaded initially but disposed when other index is selected
            Page4(), // Not preloaded and disposed when other index is selected
          ],
        ),
        bottomNavigationBar: BottomNavigationBar(
          onTap: (index) {
            setState(() => _index = index);
          },
          currentIndex: _index,
          items: [
            BottomNavigationBarItem1(),
            BottomNavigationBarItem2(),
            BottomNavigationBarItem3(),
            BottomNavigationBarItem4(),
          ],
        ),
      ),
    );
  }
}

See more details in Example or API reference!

Categories

Source repository

Projects using this package