Руководства
Функция на основе одного UseCase
Подключение снимка UseCase к Model, адаптация в Presenter и отрисовка через MvpView с явно переданным ModelBinding.
Функция на основе одного UseCase
В этом счётчике UseCase Forge служит опциональным источником бизнес-состояния. MVP-пакеты от него не зависят: оба продукта соединяет композиция приложения.
1. Определите владельца бизнес-объекта
Внешний StatefulWidget создаёт CounterUseCase и закрывает его в dispose(). MvpView не присваивает себе это владение.
2. Опишите Model функции
final class CounterModel {
const CounterModel({
required this.snapshot,
required this.increment,
});
final UseCaseSnapshot<CounterState> snapshot;
final void Function() increment;
}
Конкретный UseCase не пересекает границу. Model содержит актуальный снимок и одну разрешённую операцию.
3. Создайте стабильный ModelBinding
late final ModelBinding<CounterModel> binding = ModelBinding(
read: () => CounterModel(
snapshot: counter.state,
increment: () => counter.add(const IncrementCounter()),
),
changes: <Stream<Object?>>[counter.stream],
);
ModelBinding создаётся один раз на жизненный цикл функции. Новый экземпляр при каждом построении Flutter означал бы намеренное создание нового Presenter.
4. Адаптируйте состояние в Presenter
Presenter преобразует значение и фазу выполнения в текст и правила взаимодействия. Во время построения ViewState допустимо обратиться к MaterialLocalizations.of(context): используется актуальный контекст, который нигде не сохраняется.
Публичный increment() либо вызывает операцию Model, либо публикует CounterLimitReached. View не повторяет правило лимита.
5. Отобразите готовые значения
Передайте стабильный ModelBinding напрямую в MvpView. Параметр builder получает текущий ViewState и конкретный Presenter. Эффект обрабатывается с актуальным BuildContext, например через ScaffoldMessenger.
6. Проверьте границы
- View не имеет доступа к
CounterModel; - Presenter не может отправить необъявленную Command;
MvpViewвладеет Presenter;- внешний виджет владеет UseCase и закрывает его;
- изменение локали или темы сохраняет Presenter и перестраивает ViewState.