Как происходит переключение между состояниями в state machine
Что проверяют
Умеете ли вы описать поведение экрана или процесса как набор явных состояний и переходов, а не как россыпь булевых флагов isLoading и isError. Следом обычно спрашивают, что будет, если два события придут одновременно из разных корутин.
Как отвечать
Каркас из четырёх частей:
- состояния:
sealed interfaceс вариантамиIdle,Loading,Content(data),Error(reason). Невозможная комбинация вроде «загрузка и ошибка сразу» просто не выражается в типах; - события: тоже
sealed, это действия пользователя и результаты асинхронной работы; - переход: чистая функция
(State, Event) -> State, внутриwhenпо паре состояния и события. Недопустимое для текущего состояния событие явно игнорируется или логируется. Такую функцию легко покрыть юнит-тестами без Android; - побочные эффекты: запрос в сеть или навигация запускаются отдельно, по итогам перехода, а их результат возвращается в машину новым событием.
В Android машина обычно живёт во ViewModel, текущее состояние хранится в MutableStateFlow. Переход делайте через update { reduce(it, event) }: он атомарен и не теряет изменения при гонке, в отличие от value = reduce(value, event). Если важен строгий порядок событий, их пропускают через Channel с одним потребителем. UI подписывается через collectAsStateWithLifecycle() в Compose или repeatOnLifecycle во View. Для восстановления после смерти процесса ключевые данные кладут в SavedStateHandle.
Готовые решения: MVI-библиотеки вроде Orbit и FlowRedux или DSL для конечных автоматов на Kotlin. Для простого экрана хватает своего кода на полсотни строк.
Где спотыкаются
Ссылаются на «StateMachine из Jetpack». Такого компонента нет, а класс StateMachine в исходниках Android внутренний и приложению недоступен.
Ставят в when ветку else на всё подряд. Компилятор требует исчерпывающий when по sealed и enum, и это ваша защита: else её отключает, и новое событие молча проваливается.
Кладут одноразовые события, показ тоста или навигацию, в состояние как обычное поле. После поворота экрана тост покажется снова. Такие эффекты описывают отдельно от состояния.