读取路径:watch、read 与 listen。

Provider 负责同步状态,AsyncProvider 返回 AsyncValue,并能以严格的生命周期处理方式暴露 Future 与 Stream。

提供者类型

根据数据源和更新频率选择提供者类型。

Provider<T>

同步值与本地派生状态

AsyncProvider<T>

以 Future / Stream 驱动的 AsyncValue<T> 状态

provider.future

暴露 Provider<Future<T>> 的选择器

提示

如果状态来自网络或流,优先使用 AsyncProvider。纯同步逻辑保留给 Provider。

读取接口矩阵

在 build 路径中使用 watch,单次读取用 read,副作用监听用 listen。

最常用

watch / read / listen

ref.watch(provider)  : 订阅并在值变化时重建。
ref.read(provider)   : 读取当前快照,不订阅。
container.listen(...) : 基于回调的更新;可选 fireImmediately。

用 AsyncProvider 处理 Future 与 Stream

一个 AsyncProvider 既可以返回 Future,也可以通过 ref.emit(stream) 绑定 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);
在重建、invalidate 和 dispose 时,ref.emit(stream) 会取消之前的订阅。
AsyncValue 是一个密封类:AsyncLoading / AsyncData / AsyncError。
用 switch 做模式匹配,可以让加载与错误状态保持显式。

下一步

ProviderScope

把写操作放进提供者方法里,再通过 ref.invoke 执行。

打开更新

读取提供者

在 Consumer、ConsumerWidget 和 ConsumerStatefulWidget 之间做选择。

打开 Flutter 接口