navigate в теле composable
Вопрос
Почему нельзя писать if (state.loggedIn) navController.navigate(Home) прямо в теле composable?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
navigateнельзя вызывать из composable, только из Activity или фрагмента- Тело выполняется при каждой рекомпозиции, и навигация вызовется многократноправильный ответ
- Это вызовет утечку памяти: composable захватит NavController навсегда
- Навигация сработает только после поворота экрана, когда состояние восстановится
Разбор
Побочные эффекты в теле composable выполняются непредсказуемое число раз. После перехода исходный экран ещё может рекомпозироваться, и navigate вызовется снова, создавая дубли в стеке. Правильно вызывать навигацию из обработчиков событий или реагировать на состояние в LaunchedEffect(state.loggedIn). Сам navigate из Compose вызывать можно, утечки здесь нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Навигация между feature-модулями
Следующий вопрос
Что передавать в аргументах навигации