ApiPaginator<T, E> class

Page-number or cursor-based pagination with built-in state management.

Eliminates the 50-80 lines of boilerplate needed per list screen (page counter, hasMore flag, loading state, append logic).

Page-number pagination

final paginator = ApiPaginator<Gallery, ApiError>(
  request: (page) => dio.get('/galleries', queryParameters: {'page': page}),
  parser:  (json) => Gallery.fromJson(json),
  pageSize: 20,
);

await paginator.loadFirst();
await paginator.loadNext(); // call on scroll end

paginator.items        // List<Gallery>
paginator.hasMore      // bool
paginator.isLoading    // bool
paginator.currentPage  // int
paginator.state        // ApiState<List<Gallery>, ApiError>

Cursor-based pagination (e.g. Strapi v5)

final paginator = ApiPaginator<Photo, ApiError>.cursor(
  request: (cursor) => dio.get('/photos',
    queryParameters: cursor != null ? {'cursor': cursor} : {}),
  parser:  (json) => Photo.fromJson(json),
  cursorExtractor: (response) => response['meta']['nextCursor'] as String?,
);

Flutter widget integration

// Rebuild on state changes by listening to the stream
paginator.stream.listen((_) => setState(() {}));

// Or use PaginatedListView
PaginatedListView(
  paginator: _paginator,
  itemBuilder: (ctx, item) => GalleryCard(item),
  loadingBuilder: () => const GalleryShimmer(),
  emptyBuilder:   () => const EmptyGalleries(),
)

Constructors

ApiPaginator({required Future<Response> request(int page), required T parser(dynamic json), List<T> listParser(dynamic json)?, E errorParser(Map<String, dynamic>)?, int pageSize = 20, bool resetOnRefresh = true})
Page-number pagination.
ApiPaginator.cursor({required Future<Response> request(String? cursor), required T parser(dynamic json), required String? cursorExtractor(dynamic responseData), List<T> listParser(dynamic json)?, E errorParser(Map<String, dynamic>)?, int pageSize = 20, bool resetOnRefresh = true})
Cursor-based pagination.

Properties

currentPage → int
no setter
hashCode → int
The hash code for this object.
no setterinherited
hasMore → bool
no setter
isEmpty → bool
no setter
isLoading → bool
no setter
items → List<T>
no setter
pageSize → int
final
resetOnRefresh → bool
Whether to reset items on loadFirst (default: true)
final
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
state → ApiState<List<T>, E>
no setter

Methods

addListener(void listener()) → void
Register a callback that fires on every state change.
loadFirst() → Future<void>
Load the first page (or refresh).
loadNext() → Future<void>
Load the next page. No-op if already loading or no more pages.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
removeListener(void listener()) → void
Remove a previously registered listener.
reset() → void
Reset paginator to initial state without triggering a network request.
toString() → String
A string representation of this object.
inherited

Operators

operator ==(Object other) → bool
The equality operator.
inherited