为什么要在 Mobx Flutter 中使用 Provider?
Why should I use Provider in Mobx Flutter?
Flutter 的官方 Mobx 文档说,为了正确传输数据,您必须使用 Provider 并参考上下文来检索数据。
但为什么我不能在应用程序的根目录调用 Mobx class 并访问全局变量来获取数据?
CbtStore cbt = CbtStore();
void main() async {
runApp(const MyApp());
}
我为什么要这样做?
void main() async {
runApp(MultiProvider(
providers: [
Provider<CbtStore>(create: (_) => CbtStore()),
],
child: MyApp()));
}
在这种情况下,我如何在小部件方法中引用 Mobx,例如,如果我想在 initState 方法中调用 Mobx class 中的操作?现在我通过以下方式进行。但是在 initState 中使用 Provider 时没有上下文。
@override
void initState() {
cbt.init();
super.initState();
}
您应该做最适合您的用例的事情。
提供商之所以有用,是因为它们可以在需要的地方提供。这可能在应用程序根目录中,但也可能在小部件树中更深的地方。
提供商的另一个优势是您可以拥有通知侦听器的提供商。在这种情况下,小部件将自动重建,如果您在应用程序的任何地方存储并需要更新数据,这将非常有用。
initState
确实不允许直接使用提供者。有 3 个解决方案:
- 没有提供程序列表 (Provider.of(context, listen: false); 这允许您使用方法,但不能监听更改。
- 在构建方法中使用提供者,使用消费者。
我绝不是 flutter 方面的专家,但这正是我目前所经历的。
Provider 仅用于 mobx 的依赖注入。它不用于状态更改。
现在,当你使用 mobx 时,在大多数情况下你不需要有状态的小部件,因为你正在处理你的 mobx 存储中的状态变化,如果状态有任何变化,我们使用 Observer
来更改 ui.
如果想要用屏幕初始化一些东西而不是更喜欢使用 mobx 的构造函数 class 而不是 initState。
例如,
class MyStore = _MyStore with _$MyStore;
abstract class _MyStore with Store {
_MyStore(){
getData();
}
}
现在不要为您的所有商店使用全球供应商。仅在需要时初始化提供者。所以当你推送一个路由时,用一个提供者包裹它,这样 Provider.of(context);
就可以找到它。仅在全局要求 uired 时才使用全局存储。
您提到创建一个商店实例来使用它。当您在无状态小部件中初始化商店时,关闭屏幕时数据将被销毁,而当您重新打开它时,一切都会重新开始。当您不需要在屏幕弹出后保持状态时,它很有用。它将基于您的用例。
Flutter 的官方 Mobx 文档说,为了正确传输数据,您必须使用 Provider 并参考上下文来检索数据。
但为什么我不能在应用程序的根目录调用 Mobx class 并访问全局变量来获取数据?
CbtStore cbt = CbtStore();
void main() async {
runApp(const MyApp());
}
我为什么要这样做?
void main() async {
runApp(MultiProvider(
providers: [
Provider<CbtStore>(create: (_) => CbtStore()),
],
child: MyApp()));
}
在这种情况下,我如何在小部件方法中引用 Mobx,例如,如果我想在 initState 方法中调用 Mobx class 中的操作?现在我通过以下方式进行。但是在 initState 中使用 Provider 时没有上下文。
@override
void initState() {
cbt.init();
super.initState();
}
您应该做最适合您的用例的事情。
提供商之所以有用,是因为它们可以在需要的地方提供。这可能在应用程序根目录中,但也可能在小部件树中更深的地方。
提供商的另一个优势是您可以拥有通知侦听器的提供商。在这种情况下,小部件将自动重建,如果您在应用程序的任何地方存储并需要更新数据,这将非常有用。
initState
确实不允许直接使用提供者。有 3 个解决方案:
- 没有提供程序列表 (Provider.of(context, listen: false); 这允许您使用方法,但不能监听更改。
- 在构建方法中使用提供者,使用消费者。
我绝不是 flutter 方面的专家,但这正是我目前所经历的。
Provider 仅用于 mobx 的依赖注入。它不用于状态更改。
现在,当你使用 mobx 时,在大多数情况下你不需要有状态的小部件,因为你正在处理你的 mobx 存储中的状态变化,如果状态有任何变化,我们使用 Observer
来更改 ui.
如果想要用屏幕初始化一些东西而不是更喜欢使用 mobx 的构造函数 class 而不是 initState。
例如,
class MyStore = _MyStore with _$MyStore;
abstract class _MyStore with Store {
_MyStore(){
getData();
}
}
现在不要为您的所有商店使用全球供应商。仅在需要时初始化提供者。所以当你推送一个路由时,用一个提供者包裹它,这样 Provider.of(context);
就可以找到它。仅在全局要求 uired 时才使用全局存储。
您提到创建一个商店实例来使用它。当您在无状态小部件中初始化商店时,关闭屏幕时数据将被销毁,而当您重新打开它时,一切都会重新开始。当您不需要在屏幕弹出后保持状态时,它很有用。它将基于您的用例。