0

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

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

4

2 回答 2

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

于 2020-12-28T03:55:35.880 回答
0

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

于 2020-12-28T03:41:58.023 回答