BloomQuery<T> constructor

BloomQuery<T>({
  1. required List key,
  2. required QueryFetcher<T> fetch,
  3. Duration staleTime = const Duration(minutes: 5),
  4. Duration cacheTime = const Duration(minutes: 30),
  5. bool enabled = true,
  6. int retry = 2,
  7. Duration retryDelay = const Duration(milliseconds: 500),
})

Creates a BloomQuery with cache key, fetcher, and configuration options.

Implementation

BloomQuery({
  required this.key,
  required this.fetch,
  this.staleTime = const Duration(minutes: 5),
  this.cacheTime = const Duration(minutes: 30),
  this.enabled = true,
  this.retry = 2,
  this.retryDelay = const Duration(milliseconds: 500),
}) {
  // Check initial cache state
  final cachedEntry = BloomData.getEntry<T>(key);
  final initialData = cachedEntry?.data;
  final isStaleInitial = cachedEntry?.shouldRevalidate ?? true;

  _data = signal<T?>(initialData, debugLabel: 'query.data[${BloomData.normalizeKey(key)}]');
  _status = signal<QueryStatus>(
    initialData != null ? QueryStatus.success : QueryStatus.idle,
    debugLabel: 'query.status',
  );
  _error = signal<Object?>(null, debugLabel: 'query.error');
  _isFetching = signal<bool>(false, debugLabel: 'query.isFetching');
  _isStale = signal<bool>(isStaleInitial, debugLabel: 'query.isStale');

  // Subscribe to cache invalidations
  _invalidationSub = BloomData.onInvalidated(key).listen((_) {
    _isStale.value = true;
    if (enabled && !_isDisposed) {
      refetch();
    }
  });

  if (enabled) {
    if (cachedEntry == null || cachedEntry.shouldRevalidate) {
      _executeFetch();
    }
  }
}