Ответ вслух Middle Compose: состояние и side-effects спрашивают часто обновлено

Side-effects в Compose

Вопрос

Расскажи про побочные эффекты в Compose: зачем они нужны и какой API для чего.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Composable-функция может вызываться много раз, в любом порядке и даже быть отменена, поэтому в её теле не должно быть действий во внешнем мире. Для них есть эффекты.

Что должно прозвучать в ответе

  • Тело 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 ошибок.