Flutter 官方 Mobx 文档说,为了正确传输数据,必须使用 Provider 并引用上下文来检索数据。
但是为什么我不能直接调用应用程序根部的 Mobx 类并访问全局变量来获取数据呢?
CbtStore cbt = CbtStore();
void main() async {
runApp(const MyApp());
}
我为什么要这样做?
void main() async {
runApp(MultiProvider(
providers: [
Provider<CbtStore>(create: (_) => CbtStore()),
],
child: MyApp()));
}
在这种情况下,我如何在小部件方法中引用 Mobx,例如,如果我想在 initState 方法中调用 Mobx 类中的操作?现在我按照以下方式进行。但是在 initState 中使用 Provider 时没有上下文。
@override
void initState() {
cbt.init();
super.initState();
}
Provider 仅用于 mobx 的依赖注入。它不用于状态更改。
现在,当您使用 mobx 时,大多数情况下您不需要有状态的小部件,因为您正在 mobx 存储中处理状态更改,如果状态有任何更改,我们使用
Observer
来更改 ui。
如果想要在屏幕上初始化某些内容而不是使用 mobx 类的构造函数而不是 initState。
例如,
class MyStore = _MyStore with _$MyStore;
abstract class _MyStore with Store {
_MyStore(){
getData();
}
}
现在不要在您的所有商店中使用全球提供商。仅在需要时初始化提供程序。因此,当您推送路由时,将其与提供者一起包装,以便
Provider.of(context);
可以找到它。仅在全局需要时才使用全局存储。
您提到创建一个 store 实例来使用它。当您在无状态小部件中初始化存储时,当您关闭屏幕时,数据将被破坏,而当您重新打开它时,一切都会重新开始。当您不需要在屏幕弹出后保持状态时,它非常有用。它将基于您的用例。
您应该做最适合您的用例的事情。
提供者之所以有用,是因为它们可以在需要的地方提供。这可能位于应用程序根目录中,但也可能位于小部件树中更深的位置。
提供程序的另一个优点是您可以拥有一个通知侦听器的提供程序。在这种情况下,小部件将自动重建,如果您已存储数据并需要在应用程序中的任何位置更新数据,这会很有用。
initState
确实不允许直接使用provider。有3种解决方案:
我绝不是flutter方面的专家,但这只是我迄今为止所经历的。
我们仅将 MobX 用于“状态管理”,但对于“状态提升”,我们使用提供者。 明确地说,创建一个全局变量,我们可以在任何地方访问它,但是当我们只需要在某些“范围”(而不是整个项目)中时,提供程序用于将状态提升到该级别(更好的编程方法)。