Выбор ответа Middle Навигация обновлено

navigate в теле composable

Вопрос

Почему нельзя писать if (state.loggedIn) navController.navigate(Home) прямо в теле composable?

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

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

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

Коротко

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

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

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

Разбор

Побочные эффекты в теле composable выполняются непредсказуемое число раз. После перехода исходный экран ещё может рекомпозироваться, и navigate вызовется снова, создавая дубли в стеке. Правильно вызывать навигацию из обработчиков событий или реагировать на состояние в LaunchedEffect(state.loggedIn). Сам navigate из Compose вызывать можно, утечки здесь нет.

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

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

Термины по теме