fetch method
Future<T>
fetch({
- ResolvedQueryOptions<
T> ? options, - bool cancelRefetch = true,
- QueryFetchMeta? meta,
- 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;
}