【问题标题】:Flutter/Riverpod: Call method within StateNotifier from another StateNotifierFlutter/Riverpod:从另一个StateNotifier调用StateNotifier中的方法
【发布时间】:2021-04-04 22:05:33
【问题描述】:

如何从另一个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
    }
  }
}

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

【问题讨论】:

    标签: flutter dart provider riverpod


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      从技术上讲,不推荐将 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);
          }
        }
      }
      
      

      【讨论】:

      • 感谢您的回复。完成此任务的建议是什么?
      • 你为什么不删除第二个 Statenotifer 而只拥有一个呢?无论如何,您所做的只是访问TextControllerEditor。所以调用 HabitNotifier 中的 submitData 然后调用它? @wolfeweeks
      猜你喜欢
      • 2021-04-21
      • 2021-03-17
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多