https://developer.android.com/jetpack/compose/navigation?hl=ko#deeplinks
dependencies {
def nav_version = "2.4.1"
implementation("androidx.navigation:navigation-compose:$nav_version")
}
NavController
를 단일 NavHost
컴포저블과 연결해야 합니다. NavHost
는 구성 가능한 대상을 지정하는 탐색 그래프와 NavController
를 연결합니다.NavHost
의 콘텐츠가 자동으로 재구성됩니다. 탐색 그래프의 구성 가능한 대상은 각각 경로와 연결됩니다.NavHost(navController = navController, startDestination = "profile") {
composable("profile") { Profile(/*...*/) }
composable("friendslist") { FriendsList(/*...*/) }
/*...*/
}
@Composable
fun Profile(navController: NavController) {
/*...*/
Button(onClick = { navController.navigate("friendslist") }) {
Text(text = "Navigate next")
}
/*...*/
}
/**인자를 보내줄 떄 **/
navController.navigate("profile/user1234")
/**인자를 받을 때 **/
NavHost(startDestination = "profile/{userId}") {
...
composable("profile/{userId}") {...}
}
NavHost(startDestination = "profile/{userId}") {
...
composable(
"profile/{userId}",
arguments = listOf(navArgument("userId") { type = NavType.StringType })
) {...}
}
NavController
는 Navigation 구성요소의 중심 API로, 스테이트풀(Stateful)이며 앱의 화면과 각 화면 상태를 구성하는 컴포저블의 백 스택을 추적합니다.
컴포저블에서 rememberNavController()
메서드를 사용하여 NavController
를 만들 수 있습니다.
val navController = rememberNavController()
fun NavGraphBuilder.loginGraph(navController: NavController) {
navigation(startDestination = "username", route = "login") {
composable("username") { ... }
composable("password") { ... }
composable("registration") { ... }
}
}
NavHost(navController, startDestination = "home") {
communityGraph(navController)
loginGraph(navController)
setttingGraph(navController)
}
sealed class Screen(val route: String, @StringRes val resourceId: Int) {
object Profile : Screen("profile", R.string.profile)
object FriendsList : Screen("friendslist", R.string.friends_list)
}
val items = listOf(
Screen.Profile,
Screen.FriendsList,
)
BottomNavigation
컴포저블에서 currentBackStackEntryAsState()
함수를 사용하여 현재 NavBackStackEntry
를 가져옵니다. 이 항목을 통해 현재 NavDestination
에 액세스할 수 있습니다. 그러면 중첩된 탐색을 사용하고 있는 경우를 처리하도록 hierarchy
도우미 메서드를 통해 항목의 경로와 현재 대상 및 그 상위 대상의 경로를 비교하여 각 BottomNavigationItem
의 선택된 상태를 확인할 수 있습니다.val navController = rememberNavController()
Scaffold(
bottomBar = {
BottomNavigation {
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
items.forEach { screen ->
BottomNavigationItem(
icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
label = { Text(stringResource(screen.resourceId)) },
selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true,
onClick = {
navController.navigate(screen.route) {
// Pop up to the start destination of the graph to
// avoid building up a large stack of destinations
// on the back stack as users select items
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
// Avoid multiple copies of the same destination when
// reselecting the same item
launchSingleTop = true
// Restore state when reselecting a previously selected item
restoreState = true
}
}
)
}
}
}
) { innerPadding ->
NavHost(navController, startDestination = Screen.Profile.route, Modifier.padding(innerPadding)) {
composable(Screen.Profile.route) { Profile(navController) }
composable(Screen.FriendsList.route) { FriendsList(navController) }
}
}