繁体   English   中英

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

[英]Flutter/Riverpod: Call method within StateNotifier from another StateNotifier

如何从另一个StateNotifier调用一个StateNotifier的方法? 我想从submitData (在低级)调用addNewHabit (在顶级)。

以下是类的主体:

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);
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM