Я создаю мобильное приложение с флаттером и решил использовать mobx в качестве моей системы управления состоянием.
Я хочу иметь возможность контролировать состояние для всего приложения, например, для текущей темы (у меня есть светлая и темная тема). Поэтому я создал магазин с именем ThemeStore
и обернул свой MaterialApp
Observer
. Внутри я вызываю переменную @observable
из моего ThemeStore
. serviceLocator
- это экземпляр GetIt
с ThemeStore
, зарегистрированным как lazySingleton
.
Кроме того, у меня есть еще много магазинов для хранения других реактивных данных. Нужно ли мне оборачивать виджеты глубже в дереве виджетов внутри дополнительного наблюдателя или достаточно «Обозревателя верхнего уровня», даже если он затем должен обрабатывать несколько наблюдаемых из разных хранилищ?
Я уже пробовал этот «вложенный» подход, но пользовательский интерфейс реагирует, только если я чередую переключение значений из разных хранилищ.
Может ли проблема даже заключаться в вызове @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
),
);
}
В итоге: возможно ли вложить Observers, и только мой подход с lazySingletons и GetIt не работает, или проблема в том, что наблюдатели не могут быть вложенными?