Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Pagination and Infinite Lists | Remote Data
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Flutter State and Data Handling

bookPagination and Infinite Lists

Note
Definition

Pagination is a technique that lets you load large sets of data in smaller, manageable chunks.

In Flutter, infinite scrolling is a common way to implement pagination, where more data is fetched as the user reaches the end of a scrollable list. This approach keeps your app responsive and efficient, especially when working with remote APIs that return long lists of items.

main.dart

main.dart

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
import 'package:flutter/material.dart'; void main() => runApp(PaginatedListApp()); class PaginatedListApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: PaginatedListScreen(), ); } } class PaginatedListScreen extends StatefulWidget { @override _PaginatedListScreenState createState() => _PaginatedListScreenState(); } class _PaginatedListScreenState extends State<PaginatedListScreen> { final ScrollController _controller = ScrollController(); final List<int> _items = []; bool _isLoading = false; bool _hasMore = true; int _page = 0; final int _limit = 20; @override void initState() { super.initState(); _fetchItems(); _controller.addListener(() { if (_controller.position.pixels >= _controller.position.maxScrollExtent - 200 && !_isLoading && _hasMore) { _fetchItems(); } }); } Future<void> _fetchItems() async { setState(() { _isLoading = true; }); // Simulate API call delay await Future.delayed(Duration(seconds: 2)); // Simulate API response List<int> fetched = List.generate(_limit, (i) => _page * _limit + i); setState(() { _items.addAll(fetched); _isLoading = false; _page++; if (fetched.length < _limit) { _hasMore = false; } }); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Paginated List')), body: ListView.builder( controller: _controller, itemCount: _items.length + (_hasMore ? 1 : 0), itemBuilder: (context, index) { if (index < _items.length) { return ListTile(title: Text('Item [${_items[index]}')); } else { return Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: Center(child: CircularProgressIndicator()), ); } }, ), ); } }

Scroll controllers allow you to listen for scroll events and determine when the user is near the end of a list. In the paginated list example, a ScrollController is used to trigger the loading of more items as the user scrolls close to the bottom. A loading indicator, such as CircularProgressIndicator, is displayed at the end of the list while new data is being fetched. This provides clear feedback and ensures a smooth user experience during incremental data loading.

main.dart

main.dart

copy
123456789
void main() { List<String> currentItems = ['Apple', 'Banana', 'Cherry']; List<String> newItems = ['Date', 'Elderberry']; // Append newItems to currentItems currentItems.addAll(newItems); print(currentItems); // Output: [Apple, Banana, Cherry, Date, Elderberry] }
question mark

Which of the following is a best practice when implementing pagination in a Flutter app?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

bookPagination and Infinite Lists

Svep för att visa menyn

Note
Definition

Pagination is a technique that lets you load large sets of data in smaller, manageable chunks.

In Flutter, infinite scrolling is a common way to implement pagination, where more data is fetched as the user reaches the end of a scrollable list. This approach keeps your app responsive and efficient, especially when working with remote APIs that return long lists of items.

main.dart

main.dart

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
import 'package:flutter/material.dart'; void main() => runApp(PaginatedListApp()); class PaginatedListApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: PaginatedListScreen(), ); } } class PaginatedListScreen extends StatefulWidget { @override _PaginatedListScreenState createState() => _PaginatedListScreenState(); } class _PaginatedListScreenState extends State<PaginatedListScreen> { final ScrollController _controller = ScrollController(); final List<int> _items = []; bool _isLoading = false; bool _hasMore = true; int _page = 0; final int _limit = 20; @override void initState() { super.initState(); _fetchItems(); _controller.addListener(() { if (_controller.position.pixels >= _controller.position.maxScrollExtent - 200 && !_isLoading && _hasMore) { _fetchItems(); } }); } Future<void> _fetchItems() async { setState(() { _isLoading = true; }); // Simulate API call delay await Future.delayed(Duration(seconds: 2)); // Simulate API response List<int> fetched = List.generate(_limit, (i) => _page * _limit + i); setState(() { _items.addAll(fetched); _isLoading = false; _page++; if (fetched.length < _limit) { _hasMore = false; } }); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Paginated List')), body: ListView.builder( controller: _controller, itemCount: _items.length + (_hasMore ? 1 : 0), itemBuilder: (context, index) { if (index < _items.length) { return ListTile(title: Text('Item [${_items[index]}')); } else { return Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: Center(child: CircularProgressIndicator()), ); } }, ), ); } }

Scroll controllers allow you to listen for scroll events and determine when the user is near the end of a list. In the paginated list example, a ScrollController is used to trigger the loading of more items as the user scrolls close to the bottom. A loading indicator, such as CircularProgressIndicator, is displayed at the end of the list while new data is being fetched. This provides clear feedback and ensures a smooth user experience during incremental data loading.

main.dart

main.dart

copy
123456789
void main() { List<String> currentItems = ['Apple', 'Banana', 'Cherry']; List<String> newItems = ['Date', 'Elderberry']; // Append newItems to currentItems currentItems.addAll(newItems); print(currentItems); // Output: [Apple, Banana, Cherry, Date, Elderberry] }
question mark

Which of the following is a best practice when implementing pagination in a Flutter app?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 4
some-alt