Ответ
Да, я использовал MobX в нескольких Flutter-проектах для управления состоянием. Это библиотека, основанная на реактивном программировании, где изменения состояния автоматически обновляют зависящие от него виджеты.
Ключевые концепции, которые я применял:
- Observables: Обёртка для данных, за изменениями которых следят реакции.
- Actions: Методы, которые изменяют observables. MobX гарантирует, что все изменения происходят внутри них.
- Reactions: Автоматические отклики на изменения observables, такие как перестройка виджета (
Observer).
Пример хранилища (Store):
import 'package:mobx/mobx.dart';
part 'counter_store.g.dart';
class CounterStore = _CounterStore with _$CounterStore;
abstract class _CounterStore with Store {
@observable
int count = 0;
@action
void increment() {
count++;
}
@computed
bool get isEven => count % 2 == 0;
}
Виджет с использованием flutter_mobx:
import 'package:flutter_mobx/flutter_mobx.dart';
class CounterPage extends StatelessWidget {
final CounterStore store = CounterStore();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Observer(
builder: (_) => Text('Count: ${store.count}, Even: ${store.isEven}'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: store.increment,
child: Icon(Icons.add),
),
);
}
}
Мой опыт и выводы:
- Плюсы: Минимальный шаблонный код с кодогенерацией (
mobx_codegen), отличная производительность за счёт точечных обновлений и интуитивная модель разработки. - Использовал для средних проектов, где требовалась чёткая сепарация бизнес-логики (в сторах) и UI. Комбинация
Observable+Observerделает код очень читаемым и предсказуемым.
Ответ 18+ 🔞
Да ты знаешь, эта MobX — просто ёперный театр какой-то, ей-богу. Я на ней пару проектов на Flutter'е так, для пробы, сделал. В общем, суть в том, что это реактивная библиотека, и если где-то в данных чихнул, то все виджеты, которые от этих данных зависят, сами собой перерисовываются. Удобно, блядь.
Основные штуки, с которыми работал:
- Observables (Наблюдаемые): Это такие обёртки для твоих данных. Завернул переменную — и теперь за ней все следят, как за стриптизёршей на сцене.
- Actions (Действия): Все методы, которые эти переменные меняют. MobX орёт, чтобы ты всё менял только внутри них, иначе будет волнение ебать и всё накроется медным тазом.
- Reactions (Реакции): Автоматические отклики на изменения. Самый главный для нас — это
Observer, который виджет перестраивает. Поставил — и можешь спать спокойно.
Вот, смотри, как выглядит хранилище (Store):
import 'package:mobx/mobx.dart';
part 'counter_store.g.dart';
class CounterStore = _CounterStore with _$CounterStore;
abstract class _CounterStore with Store {
@observable
int count = 0;
@action
void increment() {
count++;
}
@computed
bool get isEven => count % 2 == 0;
}
А вот виджет, который это использует:
import 'package:flutter_mobx/flutter_mobx.dart';
class CounterPage extends StatelessWidget {
final CounterStore store = CounterStore();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Observer(
builder: (_) => Text('Count: ${store.count}, Even: ${store.isEven}'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: store.increment,
child: Icon(Icons.add),
),
);
}
}
Что я в итоге понял, ёпта:
- Что хорошо: Кода писать надо овердохуища меньше, особенно с кодогенерацией (
mobx_codegen). Производительность — огонь, потому что обновляется только то, что реально изменилось. Модель разработки — интуитивная, прям в душу бога мать, как родная. - Где применял: В проектах среднего размера, где надо было бизнес-логику от интерфейса оторвать и в отдельную комнату посадить. Связка
Observable+Observerделает код таким читаемым, что даже сам от себя охуел иногда. В общем, штука годная, если не распиздяйничать.