微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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);
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。