为什么要在 Mobx Flutter 中使用 Provider?

问题描述 投票:0回答:3

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();
  }
flutter dart mobx provider
3个回答
2
投票

Provider 仅用于 mobx 的依赖注入。它不用于状态更改。

现在,当您使用 mobx 时,大多数情况下您不需要有状态的小部件,因为您正在 mobx 存储中处理状态更改,如果状态有任何更改,我们使用

Observer
来更改 ui。

如果想要在屏幕上初始化某些内容而不是使用 mobx 类的构造函数而不是 initState。

例如,

class MyStore = _MyStore with _$MyStore;

abstract class _MyStore with Store {

_MyStore(){
  getData();
}
}

现在不要在您的所有商店中使用全球提供商。仅在需要时初始化提供程序。因此,当您推送路由时,将其与提供者一起包装,以便

Provider.of(context);
可以找到它。仅在全局需要时才使用全局存储。

您提到创建一个 store 实例来使用它。当您在无状态小部件中初始化存储时,当您关闭屏幕时,数据将被破坏,而当您重新打开它时,一切都会重新开始。当您不需要在屏幕弹出后保持状态时,它非常有用。它将基于您的用例。


1
投票

您应该做最适合您的用例的事情。

提供者之所以有用,是因为它们可以在需要的地方提供。这可能位于应用程序根目录中,但也可能位于小部件树中更深的位置。

提供程序的另一个优点是您可以拥有一个通知侦听器的提供程序。在这种情况下,小部件将自动重建,如果您已存储数据并需要在应用程序中的任何位置更新数据,这会很有用。

initState
确实不允许直接使用provider。有3种解决方案:

  1. 没有提供者列表(Provider.of(context,listen: false);这允许您使用方法,但不能监听更改。
  2. 在构建方法中使用提供者,使用消费者。

我绝不是flutter方面的专家,但这只是我迄今为止所经历的。


0
投票

我们仅将 MobX 用于“状态管理”,但对于“状态提升”,我们使用提供者。 明确地说,创建一个全局变量,我们可以在任何地方访问它,但是当我们只需要在某些“范围”(而不是整个项目)中时,提供程序用于将状态提升到该级别(更好的编程方法)。

© www.soinside.com 2019 - 2024. All rights reserved.