読み取り経路を明確に使い分ける。

Provider は同期状態、AsyncProvider は AsyncValue を返す非同期状態です。Future と Stream の扱いを一つの型で統一できます。

Providerの種類

データソースと更新頻度で型を選びます。

Provider<T>

同期値とローカル導出状態

AsyncProvider<T>

Future / Stream 駆動の AsyncValue<T>

provider.future

Provider<Future<T>> として await 可能

ヒント

ネットワークやストリーム由来の状態は、最初から AsyncProvider を選ぶと設計が整理しやすくなります。

読み取りAPIの使い分け

build 中は watch、単発取得は read、副作用連携は listen を使います。

最頻出

final value = ref.watch(myProvider);

watch / read / listen

ref.watch(provider)   : 変更を購読して再描画する。
ref.read(provider)    : 購読せず現在値だけ取得する。
container.listen(...) : コールバックで更新を受け取る(fireImmediately指定可)。

AsyncProviderでFutureとStreamを扱う

AsyncProvider は Future を返す構成と ref.emit(stream) 構成のどちらにも対応します。

user_sources.dart
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));

// Futureとして待つ
final user = await ref.watch(currentUser.future);
ref.emit(stream) は再計算・invalidate・dispose 時に前回購読を必ず解除します。
AsyncValue は AsyncLoading / AsyncData / AsyncError の sealed class です。
switch パターンで UI の読み込み・エラー分岐を明示できます。

次のステップ

ミューテーション

更新処理を provider メソッドへ寄せ、ref.invoke で実行します。

Mutationsを開く

Flutter API

Consumer / ConsumerWidget / ConsumerStatefulWidget の使い分けを確認します。

Flutter APIを開く