You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ProviderContainer监听/更新FutureProvider?

使用ProviderContainer操作FutureProvider的方法

一、获取值并监听状态变化

你可以通过ProviderContainer的listen方法监听FutureProvider的状态变化,或者用read方法一次性读取当前值。FutureProvider的返回值是AsyncValue,需要处理加载、错误、成功三种状态:

// 监听状态变化,每次值更新时触发回调
providerContainer.listen<AsyncValue<String?>>(
  futureProvider,
  (previousState, currentState) {
    currentState.when(
      loading: () => print('数据加载中'),
      error: (error, stackTrace) => print('加载失败:$error'),
      data: (value) => print('加载完成,值为:$value'),
    );
  },
);

// 一次性读取当前状态(不会监听后续变化)
final currentState = providerContainer.read(futureProvider);
currentState.when(
  loading: () => print('当前处于加载状态'),
  error: (error, stackTrace) => print('当前加载错误:$error'),
  data: (value) => print('当前值:$value'),
);

二、更新FutureProvider的数据

要让FutureProvider重新执行异步逻辑,有两种常用方式:

  1. 强制刷新:直接调用refresh方法,强制触发异步操作重新执行:
// 强制FutureProvider重新获取数据
providerContainer.refresh(futureProvider);
  1. 通过依赖触发刷新:如果你的FutureProvider依赖其他Provider(比如StateProvider),更新依赖的Provider状态会自动触发FutureProvider重新执行:
// 示例:先定义一个用于触发刷新的StateProvider
final refreshTrigger = StateProvider<bool>((ref) => false);

// 让FutureProvider依赖这个触发器
final futureProvider = FutureProvider<String?>((ref) async {
  // 监听触发器,状态变化时重新执行异步逻辑
  ref.watch(refreshTrigger);
  return await foo();
});

// 更新触发器状态,触发FutureProvider刷新
final triggerNotifier = providerContainer.read(refreshTrigger.notifier);
triggerNotifier.state = !triggerNotifier.state;

内容的提问来源于stack exchange,提问作者JAgüero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:42:10