Ответ
В Jetpack Compose навигация реализуется через библиотеку navigation-compose. Основные шаги:
- Добавь зависимость:
implementation("androidx.navigation:navigation-compose:2.7.7")
- Создай
NavController:
val navController = rememberNavController()
- Определи граф навигации в
NavHost:
NavHost(navController = navController, startDestination = "home") {
composable("home") { HomeScreen(navController) }
composable("details/{id}") { backStackEntry ->
DetailsScreen(backStackEntry.arguments?.getString("id"))
}
}
- Переход между экранами:
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и делай анимации переходов такие, чтоб глаза вылазили. В общем, инструмент годный, не манда с ушами какая-то.