본문 바로가기
Mobile/Android

[Jetpack] Navigation 간단 개념 정리

by WooHey 2024. 5. 25.

설명

  • 내비게이션 아키텍처에서는 내비게이션 스택을 이용해 사용자 경로를 추적함
  • 목적지 사이의 이동, 내비게이션 스택 관리와 관련된 모든 작업은 NavHostController 에서 제공하는 하나의 Navigation Controller 에 의해 처리된다.

목적지

  • 앱을 구성하는 각 화면(컴포저블 또는 액티비티 등)
  • Navigation Host
    • 사용자가 이동할 목적지의 placeholer 역할을 한다.
    • Navhost 호출 시에는 시작 목적지와 내비게이션 그래프 역할을 하는 Composable 인 NavHostController 인스턴스를 전달해야 한다.

Navigation Graph

  • 이동 가능한 목적지로 이용할 수 있는 모든 컴포저블로 구성된다.
  • 목적지들은 Route 형태로 선언된다.

목적지 추가하기

sealed class NavRoutes(val route: String) {
    object Home : NavRoutes("home")
    object Welcome : NavRoutes("welcome")
    object Profile : NavRoutes("profile")
}

NavHost(navController, startDestination) {
		composable(NavRoutes.Home.route) { Home() }
}

navigate()

  • 목적지로 이동
navController.navigate(NavRoutes.Home.route)

popUpTo()

  • 아이템을 스택에서 꺼내고 특정한 목적지로 돌아갈 수 있게 해준다.
navController.navigate(NavRoutes.Profile.route) {
		popUpTo(NavRoutes.Home.route)
}
  • inclusive
    • 내비게이션을 수행하기 전에 홈 목적지를 스택에서 꺼내는 코드 예시.
    navController.navigate(NavRoutes.Profile.route) {
    		popUpTo(NavRoutes.Home.route) {
    				inclusive = true
    		}
    }
    

launchSingleTop

  • 동일한 목적지의 여러 인스턴스를 스택의 최상위에 추가하는 것을 막음
  • 즉, Home → Home 으로 이동 시 기본적으로 스택에는 Home, Home 이 쌓일텐데, 최상위에 동일한 인스턴스가 쌓이는 것을 막아줌
navController.navigate(NavRoutes.Profile.route) {
		launchSingleTop = true
}

목적지에 인수 전달하기

  • 기본적으로 내비게이션 인수는 String 타입이다.
  • Deep Link 에 인수 추가
  • NavHost(startDestination = NavRoutes.Profile.route + "/{userId}") { composable(NavRoutes.Profile.route + "/{userId}") }
  • navArgument 메서드 사용하기
  • NavHost(startDestination = NavRoutes.Profile.route + "/{userId}") { composable( NavRoutes.Profile.route + "/{userId}", argument = lsitOf(navArgument("userId") { type = NavType.StringType }) ) { navBackStack -> Profile(anvBackStack.arguments?.getString("userId")) } }
  • 백 스택 항목에서 인수 추출하기
NavHost(startDestination = NavRoutes.Profile.route + "/{userId}") { backStackEntry ->
		val userId = backStackEntry.arguments?.getString("userId")

		Profile(userId)
}

NavGraph

  • 앱 전체 탐색 구조 정의
sealed class NavRoutes(val route: String) {
    object Home : NavRoutes("home")
    object Welcome : NavRoutes("welcome")
    object Profile : NavRoutes("profile")
}

NavHost

  • Fragment 를 호스팅하는 컨테이너

NavController

  • NavGraph 와 NavHost 간의 중앙 제어 포인트
  • 화면 간의 전환 수행
  • 뒤로가기 동작과 같은 탐색 제어 담당

Destination

  • NavGraph 내에 정의된 각 화면을 나타냄
  • 화면의 고유한 ID, Fragment 나 Activity 에 대한 정보를 갖고 있음

Action

  • 사용자 동작(또는 코드 실행)에 의한 화면 전환
  • 화면 이동하는 동작 정의

Safe Args

  • 화면 간 전환 시 인수를 안전하게 전달하는데 사용
  • 컴파일 시에 안전하게 전달됨(타입 안정성 보장)

Deep Linking

  • 특정 URL 이나 앱 내의 특정 위치로 이동

컴포저블로 이동

navController.navigate("friendslist")
  • 백스택 지우기
  • navController.navigate("second") { popUpTo("home") }
  • 백스택 모두 지우기
  • navController.navigate("second") { popUpTo("home") { // true -> "home" 을 포함하여 모든 화면을 백스택에서 제거 // false -> "home" 을 제외한 모든 화면을 백스택에서 제거 inclusive = true } }
  • 백스택 상단에 복사본 방지
  • navController.navigate("second") { launchSingleTop = true }

참조