Что может быть триггером для переключения между кейсами в state machine
Что проверяют
Понимаете ли вы, что переход задаётся парой «текущее состояние плюс событие», а не одним событием. За вопросом обычно стоит экран на ViewModel: смотрят, где вы храните состояние, куда кладёте разовые эффекты и как не даёте экрану попасть в невозможную комбинацию флагов.
Как отвечать
Перечислите источники событий, у андроида они делятся на четыре группы:
- действия пользователя: нажатие, свайп, ввод текста, повтор после ошибки;
- ответы внешнего мира: результат запроса, новая эмиссия из базы через
Flow, завершение задачи вWorkManager, пуш; - системные события: потеря и возврат сети, смена конфигурации, переходы жизненного цикла, результат запроса разрешения, возврат с другого экрана;
- время и внутренние условия: таймаут, дебаунс ввода, счётчик попыток, результат валидации формы.
Дальше про механику. События описываются через sealed interface, состояние иммутабельно и живёт в StateFlow, а переход это чистая функция:
fun reduce(state: State, event: Event): State = when {
state is State.Error && event is Event.Retry -> State.Loading
state is State.Loading && event is Event.Loaded -> State.Content(event.items)
else -> state
}Ветка else важна: событие, неприменимое в текущем состоянии, игнорируется, а не роняет экран. Разовые вещи, то есть навигация, снекбар, диалог, идут не в состояние, а отдельным каналом эффектов.
Где спотыкаются
Реагируют на событие, не глядя на текущее состояние. Второе нажатие кнопки в состоянии загрузки запускает второй запрос, и экран получает два ответа вперемешку. Проверка флага прямо в обработчике спасает только до появления следующей кнопки.
Кладут разовые эффекты в состояние. После поворота экрана StateFlow отдаст последнее значение заново, и диалог с ошибкой всплывёт второй раз, а переход на другой экран повторится.
Описывают состояние набором независимых полей вроде флага загрузки, текста ошибки и списка данных. Такая модель допускает загрузку поверх ошибки и пустой список при успехе, и половина багов экрана растёт именно отсюда. Закрытая иерархия состояний делает эти комбинации непредставимыми.