如何解决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.read
和 ref.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 举报,一经查实,本站将立刻删除。