Выбор ответа Junior Compose: композиция и рекомпозиция спрашивают часто обновлено

Побочные эффекты в теле composable

Вопрос

Почему нельзя писать analytics.log("screen_shown") прямо в теле composable-функции?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Функция вызывается много раз при рекомпозиции, событие уйдёт многократно. Тело composable выполняется при каждой рекомпозиции, а их число и порядок не гарантированы, рекомпозиция может быть даже отменена.

Варианты ответа

  1. Composable не может вызывать обычные функции, только другие composable и эффекты
  2. Это вызовет утечку: лямбда захватит контекст композиции навсегда
  3. Аналитика доступна только в Activity, в composable нет Context для неё
  4. Функция вызывается много раз при рекомпозиции, событие уйдёт многократноправильный ответ

Разбор

Тело composable выполняется при каждой рекомпозиции, а их число и порядок не гарантированы, рекомпозиция может быть даже отменена. Побочный эффект в теле выполнится непредсказуемое число раз. Для однократных действий есть LaunchedEffect(Unit) { } или SideEffect. Обычные функции вызывать можно, утечки здесь нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.