fetch method

Future<T> fetch({
  1. ResolvedQueryOptions<T>? options,
  2. bool cancelRefetch = true,
  3. QueryFetchMeta? meta,
  4. Future<T>? initialFuture,
})

Fetches data, deduplicating or replacing active work as configured.

Implementation

Future<T> fetch({
  ResolvedQueryOptions<T>? options,
  bool cancelRefetch = true,
  QueryFetchMeta? meta,
  Future<T>? initialFuture,
}) {
  final active = _inFlight;
  if (active != null) {
    if (!cancelRefetch || !state.hasData) return active;
    cancel(silent: true, revert: true);
    // A cancellation listener may already have started the replacement.
    final replacement = _inFlight;
    if (replacement != null) return replacement;
  }

  final fetchOptions = options ?? this.options;
  final query = fetchOptions.query;
  if (query == null && initialFuture == null) {
    return Future<T>.error(
      StateError('No query function is registered for ${key.canonical}.'),
    );
  }
  if (T == dynamic && fetchOptions.query == null && initialFuture != null) {
    _hydrationPending = initialFuture;
  }

  final fetchId = ++_fetchId;
  final previous = state;
  _revertState = previous;
  final cancellation = QueryCancellationController();
  _cancellation = cancellation;
  final canStart = _canStart(fetchOptions);
  _setState(
    state.copyWith(
      fetchStatus: canStart
          ? QueryFetchStatus.fetching
          : QueryFetchStatus.paused,
      fetchFailureCount: 0,
      fetchFailureReason: null,
      fetchMeta: meta,
      status: state.hasData ? state.status : QueryStatus.pending,
    ),
  );

  late final Future<T> future;
  future =
      _run(
        fetchId: fetchId,
        previous: previous,
        cancellation: cancellation,
        options: fetchOptions,
        meta: meta,
        initialFuture: initialFuture,
      ).whenComplete(() {
        if (identical(_inFlight, future)) {
          _inFlight = null;
          _cancellation = null;
          _revertState = null;
          if (identical(_hydrationPending, initialFuture)) {
            _hydrationPending = null;
          }
          scheduleGc();
        }
      });
  _inFlight = future;
  return future;
}