Выбор ответа Junior Compose: композиция и рекомпозиция спрашивают часто обновлено
Побочные эффекты в теле composable
Вопрос
Почему нельзя писать analytics.log("screen_shown") прямо в теле composable-функции?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Функция вызывается много раз при рекомпозиции, событие уйдёт многократно. Тело composable выполняется при каждой рекомпозиции, а их число и порядок не гарантированы, рекомпозиция может быть даже отменена.
Варианты ответа
- Composable не может вызывать обычные функции, только другие composable и эффекты
- Это вызовет утечку: лямбда захватит контекст композиции навсегда
- Аналитика доступна только в Activity, в composable нет Context для неё
- Функция вызывается много раз при рекомпозиции, событие уйдёт многократноправильный ответ
Разбор
Тело composable выполняется при каждой рекомпозиции, а их число и порядок не гарантированы, рекомпозиция может быть даже отменена. Побочный эффект в теле выполнится непредсказуемое число раз. Для однократных действий есть LaunchedEffect(Unit) { } или SideEffect. Обычные функции вызывать можно, утечки здесь нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.