Как реализовать навигацию в Jetpack Compose

Ответ

В Jetpack Compose навигация реализуется через библиотеку navigation-compose. Основные шаги:

  1. Добавь зависимость:
implementation("androidx.navigation:navigation-compose:2.7.7")
  1. Создай NavController:
val navController = rememberNavController()
  1. Определи граф навигации в NavHost:
NavHost(navController = navController, startDestination = "home") {
    composable("home") { HomeScreen(navController) }
    composable("details/{id}") { backStackEntry ->
        DetailsScreen(backStackEntry.arguments?.getString("id"))
    }
}
  1. Переход между экранами:
navController.navigate("details/123") // с параметром
// или 
navController.popBackStack() // назад

Ключевые особенности:

  • Типобезопасность через safe-args (опционально)
  • Поддержка deep links
  • Интеграция с ViewModel
  • Анимации переходов через AnimatedNavHost

Ответ 18+ 🔞

Слушай, я тут разбирался с навигацией в Jetpack Compose, и, блядь, оказалось, что всё не так страшно, как рисуют. Главное — эту библиотеку navigation-compose подключить, а там уже понеслась.

Первым делом, ёпта, в build.gradle эту самую зависимость впихни. Без неё нихуя не попрёшь, как ни крутись.

implementation("androidx.navigation:navigation-compose:2.7.7")

Дальше, чувак, тебе нужен главный по табло — NavController. Его обычно в корне приложения, в самом Composable, через rememberNavController() создаёшь. Это типа диспетчер, который будет маршруты переключать.

val navController = rememberNavController()

А теперь самое интересное — граф навигации, ёбана. Это где ты все свои экраны прописываешь, как они друг с другом связаны. Делается это в NavHost. Смотри, как просто:

NavHost(navController = navController, startDestination = "home") {
    composable("home") { HomeScreen(navController) }
    composable("details/{id}") { backStackEntry ->
        DetailsScreen(backStackEntry.arguments?.getString("id"))
    }
}

Видишь? Стартуем с "home". А чтобы на детали какого-нибудь предмета перейти, используешь путь с параметром, типа "details/{id}". Параметр этот потом из backStackEntry.arguments выковыриваешь. Удивление пиздец, но логика-то прямолинейная.

Ну и, само собой, чтобы перейти куда-то, жмёшь на кнопку и вызываешь:

navController.navigate("details/123") // вези меня к деталям предмета с id 123

А чтобы назад — navController.popBackStack(). Всё, блядь, элементарно.

Из плюшек, которые радуют:

  • Можно safe-args подключить для типобезопасности — меньше шансов накосячить с передачей параметров, волнение ебать снижается.
  • Deep links поддерживаются — чтобы из браузера или уведомления прямо в нужный экран влетать.
  • С ViewModel нормально дружит, данные не теряются.
  • Хочешь красоты — бери AnimatedNavHost и делай анимации переходов такие, чтоб глаза вылазили. В общем, инструмент годный, не манда с ушами какая-то.