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]));
}
},
);
}
}