BloomInfiniteQuery<TPage, TParam> class
A reactive asynchronous paginated/infinite query coordinator with caching, cursor/offset pagination, background revalidation, and invalidation tracking.
BloomInfiniteQuery extends Bloom's query system to support paginated datasets:
- Page Accumulation: Sequentially loads and appends pages into data / pages as fetchNextPage is invoked.
- Next Page Determination: Derives the next page parameter via getNextPageParam,
signaling end-of-list when it returns
null. - Granular Spinners: Distinguishes initial page loading (isLoading) from incremental page loading (isFetchingNextPage) to support clean bottom loading spinners.
- Concurrency Guard: Prevents duplicate in-flight requests when fetchNextPage is triggered multiple times concurrently.
- Automatic Reset on Refetch: refetch restarts from initialPageParam and replaces stale accumulated pages rather than appending duplicates.
- Cache & Invalidation: Automatically persists pages to BloomData cache and revalidates when matching query keys are invalidated via BloomData.invalidateQueries.
SSR & Browser Behavior
- SSR (
renderToHtml): Synchronously evaluates current pages signal. If preloaded or hydrated, renders initial pages in HTML. - Browser (
mount): Initiates initial fetch if enabled, subscribes to invalidations, and updates reactive signals as subsequent pages are fetched.
Example
final feedQuery = infiniteQuery<List<String>, int>(
key: ['feed'],
initialPageParam: 0,
fetch: (page) => api.fetchFeed(offset: page, limit: 10),
getNextPageParam: (lastPage, allPages) =>
lastPage.length == 10 ? allPages.length * 10 : null,
);
BloomNode buildFeed() {
return Div(
children: [
Live(() => switch (feedQuery.status.value) {
QueryStatus.loading => P(text: 'Loading initial feed...'),
QueryStatus.error => P(text: 'Error: ${feedQuery.error.value}'),
QueryStatus.success || QueryStatus.idle => Div(
children: [
for (final item in feedQuery.items) Div(text: item.toString()),
if (feedQuery.hasNextPage.value)
Button(
text: feedQuery.isFetchingNextPage.value ? 'Loading more...' : 'Load More',
on: {'click': (e) => feedQuery.fetchNextPage()},
),
],
),
}),
],
);
}
See also:
- infiniteQuery, the convenience factory function.
- BloomPaginatedQuery, type alias for BloomInfiniteQuery.
- BloomQuery, for non-paginated single-resource queries.
- BloomData, the underlying cache manager.
Constructors
-
BloomInfiniteQuery({required List key, required InfiniteQueryFn<
TPage, TParam> fetch, required TParam initialPageParam, required GetNextPageParamFn<TPage, TParam> getNextPageParam, Duration staleTime = const Duration(minutes: 5), Duration cacheTime = const Duration(minutes: 30), bool enabled = true, List getItems(TPage page)?, List<TPage> ? initialData}) - Creates a BloomInfiniteQuery and checks cache freshness or initiates an initial fetch.
Properties
- cacheTime → Duration
-
Duration after a fetch after which cached data is evicted from the cache.
final
-
data
→ ReadonlySignal<
List< TPage> ?> -
Reactive signal holding the accumulated list of resolved pages, or
nullif uninitialized.no setter - enabled → bool
-
Whether this query should automatically fetch on instantiation and upon invalidation.
final
-
error
→ ReadonlySignal<
Object?> -
Reactive signal holding any unhandled exception thrown during fetching, or
nullon success.no setter -
fetch
→ InfiniteQueryFn<
TPage, TParam> -
The asynchronous fetch function executed to retrieve a single page.
final
- getItems → List Function(TPage page)?
-
Optional function extracting a list of items from a page for the items convenience getter.
final
-
getNextPageParam
→ GetNextPageParamFn<
TPage, TParam> -
Function deriving the parameter for the next page from the most recent page and all loaded pages.
final
- hasData → bool
-
Whether the query currently holds any non-empty page data.
no setter
- hashCode → int
-
The hash code for this object.
no setterinherited
-
hasNextPage
→ ReadonlySignal<
bool> -
Reactive signal indicating whether there is a subsequent page available to fetch.
no setter
- initialPageParam → TParam
-
The parameter value used to request the first page.
final
- isError → bool
-
Whether the query failed with an error.
no setter
-
isFetching
→ ReadonlySignal<
bool> -
Reactive signal indicating whether any network fetch is in-flight (initial, refetch, or next page).
no setter
-
isFetchingNextPage
→ ReadonlySignal<
bool> -
Reactive signal indicating whether a request for the next page is actively in-flight.
no setter
- isLoading → bool
-
Whether the query is performing its initial fetch with no pages loaded.
no setter
-
isStale
→ ReadonlySignal<
bool> -
Reactive signal indicating whether the current cached page data is stale.
no setter
- isSuccess → bool
-
Whether the query has successfully resolved at least one page.
no setter
- items → List
-
Convenience getter returning all individual items across all loaded pages flattened into a single list.
no setter
- key → List
-
The structured query cache key identifying this query.
final
- nextPageParam → TParam?
-
The next parameter value that will be passed to fetch on fetchNextPage, or
nullif no more pages.no setter -
pageList
→ List<
TPage> -
Synchronous non-null snapshot of the current loaded pages.
no setter
-
pageParams
→ List<
TParam> -
The parameter values that were used to fetch each loaded page in order.
no setter
-
pages
→ ReadonlySignal<
List< TPage> ?> -
Reactive signal holding the accumulated list of resolved pages (alias for data).
no setter
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
- staleTime → Duration
-
Duration after a successful fetch during which data is considered fresh before revalidation.
final
-
status
→ ReadonlySignal<
QueryStatus> -
Reactive signal holding the current lifecycle QueryStatus.
no setter
Methods
-
dispose(
) → void - Cancels the invalidation subscription and halts future reactive updates.
-
fetchNextPage(
) → Future< List< TPage> ?> - Fetches the subsequent page using nextPageParam and appends it to pages.
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
refetch(
) → Future< List< TPage> ?> - Manually re-fetches the first page from scratch and replaces all accumulated pages.
-
setData(
List< TPage> newPages) → void - Manually updates the accumulated pages without triggering a network fetch.
-
toString(
) → String -
A string representation of this object.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited