
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로 정의하여 연결된 상태를 자동으로 복원할 수 있다.