import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Infinite Scroll ListView'),
),
body: InfiniteScrollListView(),
),
);
}
}
class InfiniteScrollListView extends StatefulWidget {
@override
_InfiniteScrollListViewState createState() => _InfiniteScrollListViewState();
}
class _InfiniteScrollListViewState extends State<InfiniteScrollListView> {
ScrollController _scrollController = ScrollController();
List<String> _listItems = List.generate(20, (index) => 'Item ${index + 1}');
bool _isLoading = false;
@override
void initState() {
super.initState();
_scrollController.addListener(_scrollListener);
}
@override
void dispose() {
_scrollController.removeListener(_scrollListener);
_scrollController.dispose();
super.dispose();
}
void _scrollListener() {
if (_scrollController.offset >= _scrollController.position.maxScrollExtent &&
!_scrollController.position.outOfRange) {
setState(() {
_isLoading = true;
});
Future.delayed(Duration(seconds: 2), () {
setState(() {
_listItems.addAll(
List.generate(20, (index) => 'Item ${_listItems.length + index + 1}'));
_isLoading = false;
});
});
}
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: _listItems.length + 1,
itemBuilder: (context, index) {
if (index == _listItems.length) {
return _isLoading
? Center(child: CircularProgressIndicator())
: Container();
}
return ListTile(
title: Text(_listItems[index]),
);
},
controller: _scrollController,
);
}
}