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
相关产品推荐
相关产品推荐

