Lazy Loading

class LazyLoadingList extends StatefulWidget {
  @override
  _LazyLoadingListState createState() => _LazyLoadingListState();
}

class _LazyLoadingListState extends State<LazyLoadingList> {
  final _scrollController = ScrollController();
  final _itemsPerPage = 10;
  var _loadedItems = 0;
  var _items = <String>[];

  @override
  void initState() {
    _scrollController.addListener(_scrollListener);
    super.initState();
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  void _scrollListener() {
    if (_scrollController.offset >=
            _scrollController.position.maxScrollExtent &&
        !_scrollController.position.outOfRange) {
      _loadMoreItems();
    }
  }

  Future<void> _loadMoreItems() async {
    await Future.delayed(Duration(seconds: 1)); // simulate network latency
    setState(() {
      _items.addAll(_generateItems(_loadedItems, _itemsPerPage));
      _loadedItems += _itemsPerPage;
    });
  }

  List<String> _generateItems(int start, int count) {
    return List.generate(count, (index) => 'Item ${start + index + 1}');
  }

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      controller: _scrollController,
      itemCount: _items.length + 1,
      itemBuilder: (context, index) {
        if (index == _items.length) {
          return Center(child: CircularProgressIndicator());
        } else {
          return ListTile(title: Text(_items[index]));
        }
      },
    );
  }
}