При использовании 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-приложения. Подходы могут различаться в зависимости от архитектуры вашего приложения и ваших предпочтений. Выберите наиболее подходящий способ в соответствии с потребностями вашего проекта.