Kotlin DSL 및 Navigation Compose의 유형 안전성

기본 제공되는 유형 안전성 API를 사용하여 탐색 그래프에 컴파일 시간 유형 안전성을 제공할 수 있습니다. 이러한 API는 앱에서 Navigation Compose 또는 Navigation Kotlin DSL을 사용하는 경우 사용할 수 있습니다. Navigation 2.8.0부터 사용 가능합니다.

이러한 API는 Safe Args가 기본 제공 탐색 XML 리소스 파일에 제공하는 탐색 그래프에 제공하는 API와 동일합니다.

경로 정의

Compose에서 유형 안전 경로를 사용하려면 먼저 직렬화 가능한 클래스 또는 경로를 나타내는 객체를 정의해야 합니다.

  • 객체: 인수가 없는 경로에 객체를 사용합니다.
  • 클래스: 인수가 있는 경로의 클래스 또는 데이터 클래스를 사용합니다.
  • KClass<T>: 매개변수가 없는 클래스나 모든 매개변수에 기본값이 있는 클래스와 같이 인수를 전달할 필요가 없는 경우 사용합니다.
    1. 예를 들면 다음과 같습니다. 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를 재구성하고 그 속성을 읽어 얻을 수 있습니다.

추가 리소스