Flutter/Riverpod:从另一个 StateNotifier 调用 StateNotifier 中的方法

问题描述

如何从另一个 StateNotifier 调用一个 StateNotifier 的方法?我想从 addNewHabit(下层)调用 submitData(上层)。

这里是类的主体:

class HabitStateNotifier extends StateNotifier<List<Habit>> {
  HabitStateNotifier(state) : super(state ?? []);

  void startAddNewHabit(BuildContext context) {
    showModalBottomSheet(
        context: context,builder: (_) {
          return NewHabit();
        });
  }

  //this one right here
  void addNewHabit(String title) {
    final newHabit = Habit(title: title);
    state.add(newHabit);
  }

  void deleteHabit(String id) {
    state.removeWhere((habit) => habit.id == id);
  }
}

class TitleControllerStateNotifier
    extends StateNotifier<TextEditingController> {
  TitleControllerStateNotifier(state) : super(state);

  void submitData() {
    if (state.text.isEmpty) {
      return;
    } else {
      //call 'addNewHabit' from above class
    }
  }
}

这样做的正确方法是什么?

解决方法

设置一个 StateNotifierProvider(来自 Riverpod),它会在运行 create 回调后返回一个 StateNotifier。此回调有一个 (ref) 参数,您可以在该参数上调用 ref.readref.watch 以在非依赖或依赖模式下获取其他提供程序。

,

从技术上讲,不推荐用作 StateNotifier 的模式是控制器,您不应该真正在控制器内部调用控制器。

但这很容易实现,因为您可以读取提供程序中的其他提供程序。

final habitProvider = StateNotifierProvider((ref) => HabitStateNotifier());

final userControllerProvider = StateNotifierProvider((ref) {
  return UserController(
   
    habitProvider : ref.read(habitProvider),);
});

然后使用引用和调用

class TitleControllerStateNotifier
    extends StateNotifier<TextEditingController> {
  TitleControllerStateNotifier(state,HabitStateNotifier habitProvider) :
  habit = habitProvider,super(state);

  final HabitStateNotifier habit;


  void submitData() {
    if (state.text.isEmpty) {
      return;
    } else {
      habit.addNewHabit(state.text);
    }
  }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...