내장된 유형 안전 API를 사용하여 탐색 그래프에 컴파일 시간 유형 안전성을 제공할 수 있습니다. 이러한 API는 앱에서 Navigation Compose 또는 Navigation Kotlin DSL을 사용하는 경우에 사용할 수 있습니다. Navigation
2.8.0
부터 사용할 수 있습니다.
이러한 API는 XML을 사용하여 빌드된 탐색 그래프에 Safe Args가 제공하는 것과 같습니다.
경로 정의
Compose에서 유형 안전 라우트를 사용하려면 먼저 라우트를 나타내는 직렬화 가능한 클래스 또는 객체를 정의해야 합니다.
직렬화 가능한 객체를 정의하려면 Kotlin 직렬화 플러그인에서 제공하는 @Serializable
주석을 사용하세요.
이 플러그인은 이러한 종속 항목을 추가하여 프로젝트에 추가할 수 있습니다.
다음 규칙에 따라 경로에 사용할 유형을 결정합니다.
- 객체: 인수가 없는 경로에 객체를 사용합니다.
- 클래스: 인수가 있는 경로에는 클래스 또는 데이터 클래스를 사용합니다.
KClass<T>
: 매개변수가 없는 클래스 또는 모든 매개변수에 기본값이 있는 클래스와 같이 인수를 전달할 필요가 없는 경우에 사용합니다.- 예:
Profile::class
- 예:
모든 경우에 객체 또는 클래스는 직렬화 가능해야 합니다.
예를 들면 다음과 같습니다.
// Define a home route that doesn't take any arguments
@Serializable
object Home
// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)
그래프 빌드
다음으로 탐색 그래프를 정의해야 합니다. composable()
함수를 사용하여 탐색 그래프에서 컴포저블을 대상으로 정의합니다.
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile.id)
}
}
이 예에서 다음 사항을 확인하세요.
composable()
는 유형 매개변수를 사용합니다. 즉,composable<Profile>
입니다.- 대상 유형을 정의하는 것은
composable("profile")
에서와 같이route
문자열을 전달하는 것보다 더 강력한 접근 방식입니다. - 경로 클래스는
val id: String
와 같이 각 탐색 인수의 유형을 정의하므로NavArgument
는 필요하지 않습니다. - 프로필 경로의 경우
toRoute()
확장 메서드는NavBackStackEntry
및 인수에서Profile
객체를 다시 만듭니다.
일반적으로 그래프를 디자인하는 방법에 관한 자세한 내용은 탐색 그래프 설계 페이지를 참고하세요.
유형 안전 경로로 이동
마지막으로 경로 인스턴스를 전달하여 navigate()
함수를 사용하여 컴포저블로 이동할 수 있습니다.
navController.navigate(Profile(id = 123))
그러면 사용자는 탐색 그래프의 composable<Profile>
대상으로 이동합니다. id
와 같은 모든 탐색 인수는 NavBackStackEntry.toRoute
를 사용하여 Profile
를 재구성하고 속성을 읽음으로써 얻을 수 있습니다.