可以嵌套带mobx的Observer窗口小部件吗?

时间:2019-06-01 10:13:18

标签: flutter dart mobx mobx-dart

我正在用Flutter开发一个移动应用程序,因此决定使用mobx作为我的状态管理系统。 我希望能够控制整个应用程序的某些状态,例如当前主题(我有浅色和深色主题)。因此,我创建了一个名为ThemeStore的商店,并用MaterialApp包装了我的Observer。在其中,我正在从@observable调用ThemeStore变量。 serviceLocatorGetIt的实例,其中ThemeStore已注册为lazySingleton
除此之外,我还有更多的商店来保存其他反应性数据。我是否需要在一个额外的观察者内部的小部件树中更深地包装小部件,或者即使他必须处理来自不同商店的多个可观察对象,“顶层观察者”是否足够?

我已经尝试过这种“嵌套”方法,但是如果我在不同商店的切换值之间进行切换,则ui只会做出反应。
问题可能仅在于通过服务定位器调用@observables或将其注册为lazySlingletons吗?


main.dart中的简化代码:

void main() {
  setupServiceLocator(); // here the GetIt instance is created
  runApp(MyApp());
}


class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    return Observer(
      builder: (_) => 
        MaterialApp(
          title: 'MyApp',
          theme: serviceLocator<ThemeStore>().theme,
          home: Dashboard(),
        ),
    );
  }
}



来自Dashboard.dart的极其简化的代码:

return Scaffold(
  body: Observer(
    builder: (_) => 
      Container(
        child: serviceLocator<ConnectionStore>().isConnected
               ? SliderInfoBlock()
               : null,
      ),
  );




来自ServiceLocator.dart的代码:

GetIt serviceLocator = GetIt();

void setupServiceLocator() {

  serviceLocator.registerLazySingleton<ThemeStore>(() => 
    ThemeStore(
      theme: MyTheme().darkTheme(),
    ),
  );

  serviceLocator.registerLazySingleton<ConnectionStore>(() => 
    ConnectionStore(
      isConnected: false
    ),
  );
}




总结:是否有可能嵌套观察者,并且只有我使用lazySingletons和GetIt的方法不起作用,还是因为观察者无法嵌套而出现问题?

0 个答案:

没有答案