读取路径: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 做模式匹配,可以让加载与错误状态保持显式。