BloomQuery<T> class

A reactive asynchronous query manager with automatic caching, request deduplication, background revalidation, and invalidation listening.

BloomQuery integrates asynchronous data fetching into Bloom's signal-based reactivity:

Backend Behavior

  • Browser (mount): Initiates network fetching on creation (if enabled), listens for invalidations, and updates reactive signals as results arrive.
  • SSR (renderToHtml): Synchronously evaluates current signal values. If data was preloaded into BloomData before rendering, SSR renders the success state immediately.

Example

final userQuery = query<User>(
  key: ['users', 123],
  fetch: () => httpClient.get<User>('/users/123'),
  staleTime: Duration(minutes: 2),
);

BloomNode buildUserProfile() {
  return Live(() => switch (userQuery.status.value) {
    QueryStatus.loading => P(text: 'Loading user...'),
    QueryStatus.error => P(text: 'Error: ${userQuery.error.value}'),
    QueryStatus.success => Div(children: [
        H1(text: userQuery.data.value?.name ?? 'Unknown'),
        if (userQuery.isFetching.value) Span(text: 'Updating...'),
      ]),
    QueryStatus.idle => P(text: 'Idle'),
  });
}

See also:

  • query, the convenience factory function for creating queries.
  • BloomInfiniteQuery, for paginated and cursor-based infinite queries.
  • BloomData, the underlying cache manager.
  • BloomMutation, for performing mutations and invalidating query keys.

Constructors

BloomQuery({required List key, required Future<T> fetch(), Duration staleTime = const Duration(minutes: 5), Duration cacheTime = const Duration(minutes: 30), bool enabled = true, T? initialData})
Creates a BloomQuery and immediately checks cache freshness or initiates a fetch if enabled.

Properties

cacheTime → Duration
Duration after a fetch after which cached data is evicted from the cache.
final
data → ReadonlySignal<T?>
Reactive signal holding the resolved query data, or null if uninitialized/loading.
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 fetch, or null on success.
no setter
fetch → Future<T> Function()
The asynchronous fetch function executed to retrieve data.
final
hasData → bool
Whether the query has non-null data available (either fresh or stale).
no setter
hashCode → int
The hash code for this object.
no setterinherited
isError → bool
Whether the query failed with an error.
no setter
isFetching → ReadonlySignal<bool>
Reactive signal indicating whether a network fetch is actively in-flight (including background revalidations).
no setter
isLoading → bool
Whether the query is currently performing its initial fetch with no data available.
no setter
isStale → ReadonlySignal<bool>
Reactive signal indicating whether the current data is stale and awaiting background revalidation.
no setter
isSuccess → bool
Whether the query resolved successfully and contains valid data.
no setter
key → List
The structured query cache key identifying this query.
final
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 (idle, loading, success, error).
no setter

Methods

dispose() → void
Cancels the query's invalidation stream subscription and prevents future state updates.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
refetch() → Future<T?>
Manually triggers a network re-fetch for this query, returning the resolved result.
setData(T newData) → void
Manually updates the cached and signal data for this query without triggering a network fetch.
toString() → String
A string representation of this object.
inherited

Operators

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