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

Riverpod Family Provider疑问:watch与listen是否指向同一实例?

Family Provider的watch与listen是否获取同一实例?

结论

当传入相同的gameLevel参数时,watch获取的GameController实例和listen监听的是同一个对象。

原因说明

Family类型的Provider(包括你使用的ChangeNotifierProvider.autoDispose.family)会根据传入的参数做实例缓存:

  • 第一次用某个gameLevel调用gameControllerProvider时,会执行你定义的创建逻辑,生成GameController实例并缓存。
  • 后续只要使用同一个gameLevel参数调用,无论是watch还是listen,都会直接复用这个缓存的实例,不会重新创建新对象。

结合你的代码分析

你在两处调用传入的是同一个gameLevel参数:

final controller = ref.watch(gameControllerProvider(gameLevel));
ref.listen<GameController>(gameControllerProvider(gameLevel), ((previous, next) {
     ....
}));

因此这两处获取/监听的是同一个GameController实例。

补充

只有当传入的gameLevel参数发生变化时,Provider才会创建新的GameController实例;同时旧的实例会因为autoDispose的特性,在没有任何组件或代码订阅它时自动销毁。

内容的提问来源于stack exchange,提问作者Mosh Mobile Software Engineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:10:18