기본 제공 유형 안전 API를 사용하여 탐색 그래프에 컴파일 시간 유형 안전성을 제공할 수 있습니다. 이러한 API는 앱에서 Navigation
Compose 또는 Navigation Kotlin DSL을 사용하는 경우에 사용할 수 있습니다. Navigation
2.8.0부터 사용할 수 있습니다.
이러한 API는 Safe Args가 XML을 사용하여 빌드된 탐색 그래프 에 제공하는 것과 동일합니다.
경로 정의
Compose에서 유형 안전 경로를 사용하려면 먼저 경로를 나타내는 직렬화 가능한 클래스 또는 객체를 정의해야 합니다.
직렬화 가능한 객체를 정의하려면 @Serializable 주석을 사용합니다.
Kotlin 직렬화 플러그인
이 플러그인은 이러한
종속 항목을 추가하여 프로젝트에 추가할 수 있습니다.
다음 규칙을 사용하여 경로에 사용할 유형을 결정합니다.
- 객체: 인수가 없는 경로에 객체를 사용합니다.
- 클래스: 인수가 있는 경로에 클래스 또는 데이터 클래스를 사용합니다.
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>입니다.- 대상 유형을 정의하는 것이
routestring을(를) 전달하는 것보다 더 강력한 접근 방식입니다.composable("profile") - 경로 클래스는
val id: String과 같이 각 탐색 인수의 유형을 정의하므로NavArgument이 필요하지 않습니다. - 프로필 경로의 경우
toRoute()확장 프로그램 메서드는Profile객체를NavBackStackEntry및 해당 인수에서 다시 만듭니다.
일반적으로 그래프를 설계하는 방법에 관한 자세한 내용은 탐색 그래프 설계 페이지를 참고하세요.
ViewModel에서 인수 액세스
유형 안전 경로의 인수에 액세스하려면 ViewModel에서 SavedStateHandle에서
SavedStateHandle.toRoute<T>()을 호출하여 경로를 가져올 수 있습니다. 여기서 T는 경로 클래스입니다.
class ProfileViewModel(
savedStateHandle: SavedStateHandle
) : ViewModel() {
private val profile = savedStateHandle.toRoute<Profile>()
private val userInfo: Flow<UserInfo> = userInfoRepository.getUserInfo(profile.id)
}
유형 안전 경로로 이동
마지막으로 경로의 인스턴스를 전달하여 navigate()
함수를 사용하여 컴포저블로 이동할 수 있습니다.
navController.navigate(Profile(id = 123))
이렇게 하면 사용자가 composable<Profile> 대상에서
탐색 그래프로 이동합니다. id와 같은 탐색 인수는 NavBackStackEntry.toRoute를 사용하여 Profile을 재구성하고 속성을 읽어 가져올 수 있습니다.