Flutter Riverpod 在本身是 StateProvider 的 class 内调用 StateProvider
Flutter Riverpod call StateProvider within a class that itself is a StateProvider
我有一个 Class
正在被 Widgets
调用,但是这个 Class
需要从另一个 Class
中提取数据。基本上,我使用 Riverpod 作为依赖注入,并且不确定这是“正确的”还是我做错了。这是我所做的:
main.dart
var myClass1 = Class1();
final class1Provider = StateProvider((ref) => myClass1);
final class2Provider = StateProvider((ref) => Class2(myClass1));
这是推荐的方法还是我应该做其他事情?
仅供参考,这确实有效;
Widget build(BuildContext context) {
displayData = (ref.watch(class2Provider.notifier).state).getData();
谢谢
这是不正确的。您正在使用 riverpod,但将其与全局变量混合使用,这破坏了使用 state-management 库的全部意义。
- 您应该在 StateProvider 中创建实例:
final class1Provider = StateProvider((ref) => Class1());
- 为了在另一个提供者中访问一个提供者的值,您需要在提供者的主体中使用
ref.watch()
方法:
final class2Provider = StateProvider((ref) {
final myClass1 = ref.watch(class1Provider);
return Class2(myClass1);
});
- 最后,要使用 StateProvider,您正在监视通知程序而不是状态。这会正确地给你一个初始值,但不会在状态改变时重建你的 UI 。相反,您应该直接观看提供商。
Widget build(BuildContext context) {
final displayData = ref.watch(class2Provider).getData();
}
有关详细信息,请仔细阅读文档 https://riverpod.dev/docs/getting_started/。
我有一个 Class
正在被 Widgets
调用,但是这个 Class
需要从另一个 Class
中提取数据。基本上,我使用 Riverpod 作为依赖注入,并且不确定这是“正确的”还是我做错了。这是我所做的:
main.dart
var myClass1 = Class1();
final class1Provider = StateProvider((ref) => myClass1);
final class2Provider = StateProvider((ref) => Class2(myClass1));
这是推荐的方法还是我应该做其他事情?
仅供参考,这确实有效;
Widget build(BuildContext context) {
displayData = (ref.watch(class2Provider.notifier).state).getData();
谢谢
这是不正确的。您正在使用 riverpod,但将其与全局变量混合使用,这破坏了使用 state-management 库的全部意义。
- 您应该在 StateProvider 中创建实例:
final class1Provider = StateProvider((ref) => Class1());
- 为了在另一个提供者中访问一个提供者的值,您需要在提供者的主体中使用
ref.watch()
方法:
final class2Provider = StateProvider((ref) {
final myClass1 = ref.watch(class1Provider);
return Class2(myClass1);
});
- 最后,要使用 StateProvider,您正在监视通知程序而不是状态。这会正确地给你一个初始值,但不会在状态改变时重建你的 UI 。相反,您应该直接观看提供商。
Widget build(BuildContext context) {
final displayData = ref.watch(class2Provider).getData();
}
有关详细信息,请仔细阅读文档 https://riverpod.dev/docs/getting_started/。