読み取り経路を明確に使い分ける。
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 の読み込み・エラー分岐を明示できます。