Пути чтения: watch, read и listen.

Provider даёт синхронное состояние. AsyncProvider возвращает AsyncValue и может предоставлять Future и Stream с жёстким контролем жизненного цикла.

Типы провайдеров

Выбирайте тип провайдера по источнику данных и частоте обновления.

Provider<T>

Синхронные значения и локальное производное состояние

AsyncProvider<T>

Состояние на основе Future/Stream как AsyncValue<T>

provider.future

Селектор, который раскрывает Provider<Future<T>>

Совет

Если состояние приходит из сети или потока, сначала выбирайте AsyncProvider. Provider оставляйте для чисто синхронной логики.

Матрица API чтения

Используйте watch в build-путях, read для разового доступа и listen для побочных эффектов.

Чаще всего

watch / read / listen

ref.watch(provider)  : subscribe and rebuild when value changes.
ref.read(provider)   : read current snapshot without subscribing.
container.listen(...) : callback-driven updates; optional fireImmediately.

Future и Stream с AsyncProvider

Один AsyncProvider может вернуть Future или привязать Stream через ref.emit(stream).

final currentUser = AsyncProvider<User>((ref) async {
  final api = ref.watch(apiProvider);
  return api.me();
});

final liveUser = AsyncProvider<User>((ref) {
  final stream = ref.watch(apiProvider).live();
  ref.emit(stream);
  return const User(name: 'Loading...');
}, autoDispose: true, autoDisposeDelay: const Duration(milliseconds: 250));

// Await as Future
final user = await ref.watch(currentUser.future);
ref.emit(stream) отменяет предыдущую подписку при перестройке, invalidate и dispose.
AsyncValue - это sealed-класс: AsyncLoading / AsyncData / AsyncError.
Сопоставление через switch делает UI загрузки и ошибок явным.

Следующие шаги

Mutations

Перенесите операции записи в методы провайдера и запускайте их через ref.invoke.

Открыть мутации

Flutter API

Выберите между Consumer, ConsumerWidget и ConsumerStatefulWidget.

Открыть Flutter API