Можно ли вкладывать виджеты Observer в флаттер с помощью mobx? - PullRequest
0 голосов
/ 01 июня 2019

Я создаю мобильное приложение с флаттером и решил использовать 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 не работает, или проблема в том, что наблюдатели не могут быть вложенными?

...