我正在用Flutter开发一个移动应用程序,因此决定使用mobx作为我的状态管理系统。
我希望能够控制整个应用程序的某些状态,例如当前主题(我有浅色和深色主题)。因此,我创建了一个名为ThemeStore
的商店,并用MaterialApp
包装了我的Observer
。在其中,我正在从@observable
调用ThemeStore
变量。 serviceLocator
是GetIt
的实例,其中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的方法不起作用,还是因为观察者无法嵌套而出现问题?