Side-effects в Compose
Вопрос
Расскажи про побочные эффекты в Compose: зачем они нужны и какой API для чего.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Тело composable должно быть чистым, рекомпозиции непредсказуемы
LaunchedEffect для корутин, перезапуск по ключам
DisposableEffect для подписок с onDispose
rememberCoroutineScope для запуска из колбэков
SideEffect для синхронизации с внешними объектами
rememberUpdatedState для актуальных значений в долгом эффекте
Что могут спросить следом
- Что будет с LaunchedEffect(Unit) при повороте?
- Как показать снекбар по событию из ViewModel?
- Чем produceState отличается от LaunchedEffect?
Разбор
Composable-функция может вызываться много раз, в любом порядке и даже быть отменена, поэтому в её теле не должно быть действий во внешнем мире. Для них есть эффекты. LaunchedEffect запускает корутину при входе в композицию и перезапускает её при смене ключей, я использую его для загрузки по id, показа снекбара или анимаций. DisposableEffect для подписок, которые надо снять: листенеры, LifecycleObserver, ресиверы, отписка в onDispose. Если корутину надо запустить по клику, беру rememberCoroutineScope, его корутины отменятся вместе с composable. SideEffect выполняется после каждой успешной рекомпозиции и нужен, чтобы передать состояние Compose объекту вне Compose, например аналитике или контроллеру системных панелей. Если долгому эффекту нужен параметр, который может меняться, но перезапуск не нужен, оборачиваю его в rememberUpdatedState. Главное в эффектах это ключи: лишний ключ даёт перезапуски, пропущенный приводит к работе со старым значением.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.