Activity
가 여러 Fragment
를 호스트하는 구조를 쉽게 구현할 수 있게 해준다.NavHost
는 네비게이션 라이브러리의 일부이며, NavController
와 함께 작동하여 화면 전환, 데이터 전달, 백 스택 관리 등의 기능을 수행한다.NavHost
의 주요 개념NavHost
사용 예시import androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import androidx.navigation.compose.composable
@Composable
fun MyApp() {
// NavController 인스턴스 생성
val navController = rememberNavController()
// NavHost 선언
NavHost(navController = navController, startDestination = "home") {
// "home" 목적지(HomeScreen 컴포저블)을 네비게이션 그래프에 추가
composable("home") { HomeScreen(navController) }
// "detail" 목적지(DetailScreen 컴포저블)를 네비게이션 그래프에 추가
// 여기서 "itemId"는 DetailScreen으로 넘겨주는 인자
composable("detail/{itemId}"
,arguments = listOf(navArgument("id") { type = NavType.IntType }) {
backStackEntry ->
// 인자로 전달받은 itemId 사용
val itemId = backStackEntry.arguments?.getString("itemId")
DetailScreen(itemId)
}
}
}
@Composable
fun HomeScreen(navController: NavController) {
// 화면 구성 및 "detail" 목적지로 네비게이션 하는 버튼 등을 포함
}
@Composable
fun DetailScreen(itemId: String?) {
// 화면 구성
}
NavHost
는 rememberNavController
를 통해 생성된 navController
인스턴스를 사용하여 네비게이션을 관리한다.startDestination
은 네비게이션 그래프에서 시작하는 첫 화면의 라우트를 지정한다.composable
함수를 통해 각 목적지(여기서는 컴포저블 함수)를 네비게이션 그래프에 추가한다.backStackEntry.arguments
를 사용하여 다른 화면에서 전달받은 인자를 사용할 수 있다.val navController = rememberNavController()
NavController
는 대상을 BackStack
에 추가하거나 삭제NavController
는 첫 번째 대상을 백 스택의 맨 위로 푸시NavController.navigate()
는 지정된 대상을 스택 상단으로 푸시NavController.navigateUp()
, NavController.popBackStack()
메서드가각각 호출되어 스택에서 최상단 대상을 팝한다.NavController.popBackStack()
은 현재 대상을 백 스택에서 팝하고 이전 대상으로 이동한다.popBackStack()
의 오버로드를 사용한다.inclusive
불리언은 지정된 대상으로 이동한 뒤에 이를 백스택에서 팝해야하는지 결정
navController.popBackStack(R.id.destinationId, true)
→ NavController
는 정수 ID가 destinationId
인 대상으로 다시 돌아갑니다. inclusive
인수 값이 true
이므로 NavController
는 지정된 대상을 백 스택에서 팝
popBackStack()
이 false
를 반환하면 NavController.getCurrentDestination()
호출에서 null
이 반환될 수 있다. 이 경우 사용자에게 빈 화면이 표시if (!navController.popBackStack()) {
finish()
}
navigate()
함수 호출에 popUpTo()
인수를 추가한다.inclusive
매개변수는 지정된 대상도 백 스택에서 팝할지 결정navController.navigate("destination_b") {
popUpTo("destination_a") {
inclusive = true
saveState = true
}
}
popUpTo
를 사용하여 대상으로 이동할 때 백 스택에서 팝된 모든 대상의 상태를 저장할 수 있다.restoreSaveState
를 true
로 정의하여 연결된 상태를 자동으로 복원할 수 있다.