When developing mobile or web applications that consume APIs, handling large datasets efficiently is crucial. One of the most common solutions is pagination — breaking down data into manageable chunks. This approach improves performance, reduces memory usage, and enhances user experience. In this article, we’ll dive into handling pagination in API requests using Kotlin (for Android) and Dart (for Flutter).

What is Pagination?
Pagination is the process of dividing a dataset into discrete pages. When requesting large lists from APIs – such as lists of users, posts, or products – loading all data at once can lead to performance bottlenecks. Instead, pagination allows us to fetch only a subset of data at a time, improving speed and responsiveness.
Pagination in Kotlin (Android)
In Android development, Kotlin offers clean syntax and features like coroutines and sealed classes that make implementing pagination smoother. There are several types of pagination supported in Android:
- Offset-based pagination
- Page-based pagination
- Cursor-based pagination
Here’s a basic example using Retrofit and coroutines for offset-based pagination:
interface ApiService { @GET("items") suspend fun getItems( @Query("offset") offset: Int, @Query("limit") limit: Int ): Response<List<Item>> }
You can then call this in a ViewModel using a coroutine loop to fetch more data as the user scrolls:
var offset = 0 val limit = 20 fun loadMoreItems() { viewModelScope.launch { val response = apiService.getItems(offset, limit) if (response.isSuccessful) { itemList.addAll(response.body() ?: emptyList()) offset += limit } } }
Pagination in Dart (Flutter)
Flutter and Dart offer similar flexibility. You can use http
, dio
, or GraphQL clients for API interaction. Here’s an example using the http
package and scroll detection:
Future<List<Item>> fetchItems(int page, int limit) async { final response = await http.get(Uri.parse('https://api.example.com/items?page=$page&limit=$limit')); if (response.statusCode == 200) { return parseItems(jsonDecode(response.body)); } else { throw Exception('Failed to load items'); } }
In a Flutter widget, you can load more data as the user scrolls to the end:
_scrollController.addListener(() { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) { loadMoreItems(); } });
Comparison: Kotlin vs Dart for Pagination
Feature | Kotlin (Android) | Dart (Flutter) |
---|---|---|
Native API Support | Retrofit, Paging 3, Coroutines | Dio, http, GraphQL |
Scroll Detection | RecyclerView + ScrollListener | ScrollController |
Asynchronous Handling | Coroutines | async/await |
Built-in Pagination Libs | Jetpack Paging Library | Limited (custom implementation) |
Best Practices
- Always check for the last page to stop requests.
- Show loading indicators to users.
- Handle API errors gracefully.
- Use caching for previously loaded pages.
Learn More About Pagination
To understand pagination concepts deeply, check out this comprehensive guide to API pagination.