Kotlin DSL 및 Navigation Compose의 유형 안전성

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

이러한 API는 Safe Args가 XML을 사용하여 빌드된 탐색 그래프 에 제공하는 것과 동일합니다.

경로 정의

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

직렬화 가능한 객체를 정의하려면 @Serializable 주석을 사용합니다. Kotlin 직렬화 플러그인 이 플러그인은 이러한 종속 항목을 추가하여 프로젝트에 추가할 수 있습니다.

다음 규칙을 사용하여 경로에 사용할 유형을 결정합니다.

  • 객체: 인수가 없는 경로에 객체를 사용합니다.
  • 클래스: 인수가 있는 경로에 클래스 또는 데이터 클래스를 사용합니다.
  • 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>입니다.
  • 대상 유형을 정의하는 것이 route string을(를) 전달하는 것보다 더 강력한 접근 방식입니다.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을 재구성하고 속성을 읽어 가져올 수 있습니다.

추가 리소스