Руководства
Несколько UseCase на одном экране
Объединение независимых снимков на границе представления без переноса атомарной бизнес-координации в MVP.
Несколько UseCase на одном экране
Экран профиля может загружать данные и сохранять изменения через разные UseCase. MVP способен представить оба процесса, не объявляя их единой бизнес-транзакцией.
1. Поместите оба снимка в Model
final class ProfileModel {
const ProfileModel({
required this.profile,
required this.save,
required this.reload,
required this.updateName,
});
final UseCaseSnapshot<ProfileState> profile;
final UseCaseSnapshot<SaveProfileState> save;
final void Function() reload;
final void Function(String name) updateName;
}
2. Наблюдайте оба источника
ModelBinding.changes содержит оба Stream, повторяющих последнее значение. После сигнала любого источника read() получает оба актуальных снимка. Presenter работает с полным состоянием функции, а не с частичным событием.
3. Постройте единые правила экрана
Presenter объединяет загрузку, сохранение, имя, статус и доступность кнопок в один ProfileViewState. View не определяет, какой UseCase занят, и не объединяет две подписки.
4. Публикуйте эффект только при значимом переходе
Повтор последнего состояния и явное начальное чтение могут дать эквивалентные снимки. Перед ProfileSaved сравните предыдущую и текущую фазы сохранения. Не публикуйте эффект безусловно из onModelChanged.
5. Оставьте бизнес-координацию в бизнес-слое
Агрегация для экрана корректна, пока загрузка и сохранение остаются независимыми операциями. Если они обязаны выполняться атомарно, требуется единая координирующая бизнес-граница. Ark MVP не запрещает такое решение, но и не навязывает его.
Владелец функции закрывает оба UseCase. MvpView закрывает один Presenter. Model и ViewState остаются неизменяемыми значениями без ресурсов.