Пути чтения: 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);
Следующие шаги
Mutations
Перенесите операции записи в методы провайдера и запускайте их через ref.invoke.
Открыть мутации