BloomInfiniteQuery<TPage, TParam> constructor
BloomInfiniteQuery<TPage, TParam> ({
- 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.
Implementation
BloomInfiniteQuery({
required this.key,
required this.fetch,
required this.initialPageParam,
required this.getNextPageParam,
this.staleTime = const Duration(minutes: 5),
this.cacheTime = const Duration(minutes: 30),
this.enabled = true,
this.getItems,
List<TPage>? initialData,
}) {
final rawEntry = BloomData.getEntry<dynamic>(key);
List<TPage>? initialPages;
bool isStaleInitial = true;
if (rawEntry != null && rawEntry.data != null) {
if (rawEntry.data is List<TPage>) {
initialPages = rawEntry.data as List<TPage>;
} else if (rawEntry.data is List) {
initialPages = (rawEntry.data as List).cast<TPage>();
}
isStaleInitial = rawEntry.shouldRevalidate;
} else if (initialData != null && initialData.isNotEmpty) {
initialPages = initialData;
isStaleInitial = false;
BloomData.putEntry<List<TPage>>(
QueryCacheEntry<List<TPage>>(
key: key,
data: initialData,
updatedAt: DateTime.now(),
staleTime: staleTime,
cacheTime: cacheTime,
isStale: false,
),
);
}
_data = signal<List<TPage>?>(initialPages);
_status = signal<QueryStatus>(
initialPages != null && initialPages.isNotEmpty
? QueryStatus.success
: QueryStatus.idle,
);
_error = signal<Object?>(null);
_isFetching = signal<bool>(false);
_isFetchingNextPage = signal<bool>(false);
_isStale = signal<bool>(isStaleInitial);
if (initialPages != null && initialPages.isNotEmpty) {
_pageParams = [initialPageParam];
_nextPageParam = getNextPageParam(initialPages.last, initialPages);
_hasNextPage = signal<bool>(_nextPageParam != null);
} else {
_nextPageParam = initialPageParam;
_hasNextPage = signal<bool>(false);
}
_invalidationSub = BloomData.onInvalidated(key).listen((_) {
_isStale.value = true;
if (enabled && !_isDisposed) {
refetch();
}
});
if (enabled) {
if (rawEntry == null || rawEntry.shouldRevalidate) {
if (initialPages == null || isStaleInitial) {
_executeInitialFetch();
}
}
}
}