MobX не перерисовывает виджет. Как передать Store в другой класс?

При использовании MobX вместе с Flutter, обновление виджетов осуществляется не при изменении состояния внутри хранилища, а с помощью аннотаций @observable, @computed и @action, указывающих, какие переменные должны быть отслеживаемыми, какие вычисляемые переменные зависят от них, и какие методы могут изменять состояние хранилища.

Для того чтобы передать хранилище (store) из одного класса в другой, можно использовать различные подходы в зависимости от архитектуры вашего приложения. Вот несколько возможных способов передачи хранилища:

1. Передача через конструктор: Создайте экземпляр хранилища в одном классе и передайте его в другой класс через параметр конструктора. Например:

class MyWidget extends StatelessWidget {
  final MyStore store;

  MyWidget({required this.store});

  @override
  Widget build(BuildContext context) {
    return SomeOtherWidget(store: store);
  }
}

class SomeOtherWidget extends StatelessWidget {
  final MyStore store;

  SomeOtherWidget({required this.store});

  @override
  Widget build(BuildContext context) {
    // Доступ к хранилищу через store
    ...
  }
}

2. Использование InheritedWidget: Создайте класс-наследника от InheritedWidget, который будет содержать ваше хранилище и раздавать его дочерним виджетам. В этом случае вам не нужно передавать хранилище явно в конструкторе. Пример:

class MyStoreInherited extends InheritedWidget {
  final MyStore store;

  MyStoreInherited({
    Key? key,
    required this.store,
    required Widget child,
  }) : super(key: key, child: child);

  @override
  bool updateShouldNotify(MyStoreInherited oldWidget) {
    return store != oldWidget.store;
  }

  static MyStore of(BuildContext context) {
    final widget = context.dependOnInheritedWidgetOfExactType<MyStoreInherited>();
    return widget!.store;
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyStore store = MyStore();

    return MyStoreInherited(
      store: store,
      child: SomeOtherWidget(),
    );
  }
}

class SomeOtherWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyStore store = MyStoreInherited.of(context);
    // Доступ к хранилищу через store
    ...
  }
}

В этом примере MyStoreInherited класс наследуется от InheritedWidget и хранит экземпляр вашего хранилища. Функция of позволяет получить доступ к хранилищу из дочерних виджетов.

3. Использование Provider: Provider - это пакет управления состоянием, построенный на основе InheritedWidget. Он упрощает передачу и доступ к состоянию во всем приложении. Пример использования Provider с MobX:

void main() {
  runApp(
    MultiProvider(
      providers: [
        Provider<MyStore>(
          create: (_) => MyStore(),
        ),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyWidget(),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyStore store = Provider.of<MyStore>(context);

    return SomeOtherWidget();
  }
}

class SomeOtherWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyStore store = Provider.of<MyStore>(context);
    // Доступ к хранилищу через store
    ...
  }
}

Provider позволяет создавать, управлять и получать доступ к объектам во всем дереве виджетов, используя инъекцию зависимости. В примере выше мы создаем хранилище MyStore, затем оборачиваем MyApp виджет в MultiProvider, чтобы он мог обеспечивать доступ к хранилищу во всем приложении. Чтобы получить доступ к хранилищу, мы используем Provider.of<MyStore>(context) внутри MyWidget и SomeOtherWidget.

Это лишь несколько способов передачи хранилища MobX в другие классы внутри Flutter-приложения. Подходы могут различаться в зависимости от архитектуры вашего приложения и ваших предпочтений. Выберите наиболее подходящий способ в соответствии с потребностями вашего проекта.