将StateNotifier改为Notifier后,如何重写NotifierProvider并调用其他Provider
问题
已将StateNotifier类修改为Notifier类,但不清楚如何重写对应的Provider。原StateNotifier类会将其他Provider监听的值作为实例变量使用,请问如何在NotifierProvider中调用其他Provider所监听的值?
给出的新Notifier类代码:
class CommunityController extends Notifier<bool> { final CommunityRepository _communityRepository; final StorageRepository _storageRepository; final Ref _ref; CommunityController({ required CommunityRepository communityRepository, required StorageRepository storageRepository, required Ref ref, }) : _communityRepository = communityRepository, _storageRepository = storageRepository, _ref = ref; @override bool build() { return false; } void createCommunity(String name, BuildContext context) async { state = true; final uid = _ref.read(userProvider)?.uid ?? ''; Community community = Community( id: name, name: name, banner: Constants.bannerDefault, avatar: Constants.avatarDefault, members: [uid], mods: [uid], ); final res = await _communityRepository.createCommunity(community); state = false; res.fold((l) => showSnackBar(context, l.message), (r) { showSnackBar(context, 'Community created successfully!'); Routemaster.of(context).pop(); }); } Stream<Community> getCommunityByName(String name) { return _communityRepository.getCommunityByName(name); } }
待改写的原StateNotifierProvider代码:
final communityControllerProvider = StateNotifierProvider<CommunityController, bool>((ref) { final communityRepository = ref.watch(communityRepositoryProvider); final storageRepository = ref.watch(storageRepositoryProvider); return CommunityController( communityRepository: communityRepository, storageRepository: storageRepository, ref: ref, ); });
解决方案
1. 优化Notifier类的写法
Riverpod的新Notifier体系内置了ref属性,无需手动在构造函数中传入Ref。同时可以将依赖的仓库通过ref.watch在build方法中获取,自动监听仓库Provider的变化:
class CommunityController extends Notifier<bool> { late final CommunityRepository _communityRepository; late final StorageRepository _storageRepository; @override bool build() { // 在build方法中监听仓库Provider,变化时自动重建Notifier _communityRepository = ref.watch(communityRepositoryProvider); _storageRepository = ref.watch(storageRepositoryProvider); return false; } void createCommunity(String name, BuildContext context) async { state = true; // 直接使用内置ref读取其他Provider的值 final uid = ref.read(userProvider)?.uid ?? ''; Community community = Community( id: name, name: name, banner: Constants.bannerDefault, avatar: Constants.avatarDefault, members: [uid], mods: [uid], ); final res = await _communityRepository.createCommunity(community); state = false; res.fold((l) => showSnackBar(context, l.message), (r) { showSnackBar(context, 'Community created successfully!'); Routemaster.of(context).pop(); }); } Stream<Community> getCommunityByName(String name) { return _communityRepository.getCommunityByName(name); } }
2. 改写为NotifierProvider
替换原StateNotifierProvider为NotifierProvider,无需手动传入参数,直接关联CommunityController即可:
final communityControllerProvider = NotifierProvider<CommunityController, bool>( CommunityController.new, );
关键说明
- 调用其他Provider:在
Notifier的方法中,直接用ref.read()(单次读取,不监听变化)或ref.watch()(持续监听,值变化时触发重建)获取目标Provider的值即可。 - 依赖管理:在
build方法中通过ref.watch获取仓库,能确保仓库实例更新时,Notifier自动重建并使用最新实例,符合Riverpod的响应式设计。
内容的提问来源于stack exchange,提问作者wasa-bi
相关产品推荐
相关产品推荐

