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()));
}
在这种情况下,如果我想在initState方法中调用Mobx类中的操作,我该如何在小部件方法中引用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);
可以找到它。只有在全局需要时才使用全局存储。
你提到创建一个存储实例来使用它。当你在无状态窗口小部件中初始化存储时,当你关闭屏幕时,数据会被破坏,当你重新打开它时,一切都会重新开始。当您不需要在屏幕弹出后保持状态时,它很有用。它将基于您的用例。
您应该做最适合您的用例的事情。
提供者之所以有用,是因为它们可以在需要的地方提供。这可以在应用程序根目录中,也可以在小部件树中更深的位置。
提供程序的另一个优点是,您可以拥有一个通知侦听器的提供程序。在这种情况下,小部件将自动重建,如果您已经存储并需要在应用程序中各处更新数据,这将非常有用。
initState
实际上不允许直接使用提供者。有三种解决方案:
- 没有提供程序列表(provider.of(context,listen:false(;这允许您使用方法,但不听取更改
- 使用使用者在生成方法中使用提供程序
我绝不是扑动方面的专家,但这正是我迄今为止所经历的。