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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:40:35