StateFlow, SharedFlow и LiveData
Вопрос
Сравни StateFlow, SharedFlow и LiveData. Что ты используешь для состояния UI и для одноразовых событий?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
StateFlow: текущее значение, начальное обязательно, равные не эмитит
SharedFlow: настраиваемый replay и буфер, без подписчиков значения теряются
LiveData: привязка к lifecycle из коробки, но только главный поток и нет операторов Flow
Для состояния StateFlow с collectAsStateWithLifecycle
Для событий Channel или событие как часть состояния
Что могут спросить следом
- Почему событие через StateFlow плохо?
- Как превратить Room Flow в StateFlow?
- Что такое конфляция в StateFlow?
Разбор
Для состояния экрана я использую StateFlow: у него всегда есть текущее значение, новый подписчик после поворота сразу его получает, а одинаковые значения подряд не эмитятся. Изменяю через update, чтобы не терять параллельные изменения. SharedFlow более общий: можно настроить replay, буфер и стратегию переполнения, значения необязательны. Минус для событий: если подписчика нет, значение без replay теряется. LiveData знает про жизненный цикл из коробки, но привязан к главному потоку, слабее по операторам и не подходит для слоя данных; в новом коде его заменяют StateFlow плюс repeatOnLifecycle или collectAsStateWithLifecycle. Для одноразовых событий вроде снекбара есть два подхода: Channel с receiveAsFlow, который не теряет значение и отдаёт его одному получателю, или моделировать событие как часть состояния и сбрасывать его после обработки, как рекомендует гайд Android. Через StateFlow события делать плохо: одинаковое событие подряд не придёт.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.