Navigation 3에서는 메타데이터를 사용하여 NavEntry, Scene, NavDisplay과 같은 다양한 라이브러리 구성요소 간에 임의의 정보를 공유합니다. 가장 기본적인 수준에서 메타데이터는 Map<String, Any>입니다.
하지만 이 라이브러리는 메타데이터를 더 간단하고 유형에 안전하게 읽고 쓸 수 있도록 추가 추상화 기능을 제공합니다.
NavEntry 메타데이터 제공
앱에서 NavEntry 인스턴스를 직접 빌드하는 경우 metadata 생성자 매개변수를 사용하여 항목의 메타데이터를 제공합니다.
when (key) { is Home -> NavEntry(key, metadata = mapOf("key" to "value")) {} }
앱에서 entryProvider DSL을 사용하는 경우 entry 함수의 metadata 매개변수를 통해 메타데이터를 제공합니다. 이 함수에는 두 가지 오버로드가 있습니다. 하나는 맵을 직접 사용하고 다른 하나는 항목의 키를 인수로 전달하는 람다를 사용합니다.
entry<Home>(metadata = mapOf("key" to "value")) { /* ... */ } entry<Conversation>(metadata = { key: Conversation -> mapOf("key" to "value: ${key.id})") }) { /* ... */ }
Scene 메타데이터 제공
기본적으로 Scene.metadata는 entries 속성의 마지막 항목의 metadata를 반환하는 맞춤 getter를 사용하거나 null인 경우 빈 지도를 사용합니다. Scene 인터페이스를 구현할 때 필요에 따라 이 기본 동작을 재정의할 수 있습니다.
메타데이터 DSL 사용
라이브러리의 1.1.0-beta01 출시에서 도입된 메타데이터 도메인별 언어 (DSL)는 메타데이터를 저장하는 데 사용되는 Map<String, Any>를 만들기 위한 형식 안전 빌더를 제공합니다.
메타데이터 키 정의
DSL은 NavMetadataKey 인터페이스를 사용하여 메타데이터 키와 연결된 값의 유형을 일관되게 유지합니다.
메타데이터 키를 정의하는 규칙은 해당 키와 연결된 값을 읽을 클래스(또는 함수나 컴포저블의 경우 관련 객체)의 중첩 객체로 포함하는 것입니다.
// For classes such as scene strategies or nav entry decorators, you can define the keys // as nested object. class MySceneStrategy<T : Any> : SceneStrategy<T> { // ... object MyStringMetadataKey : NavMetadataKey<String> } // An example from NavDisplay. // Because NavDisplay is a function, the metadata keys are defined in an object with the same name. public object NavDisplay { public object TransitionKey : NavMetadataKey<AnimatedContentTransitionScope<Scene<*>>.() -> ContentTransform> }
DSL을 사용하여 메타데이터 빌드
메타데이터 맵을 만들려면 람다 매개변수를 사용하는 metadata 함수를 사용합니다. 이 람다 내에서 put 함수를 사용하여 NavMetadataKey 및 해당 값을 사용하여 맵에 항목을 추가합니다.
entry<Home>( metadata = metadata { put(NavDisplay.TransitionKey) { fadeIn() togetherWith fadeOut() } // An additional benefit of the metadata DSL is the ability to use conditional logic if (condition) { put(MySceneStrategy.MyStringMetadataKey, "Hello, world!") } } ) { // ... }
메타데이터 키를 사용하여 메타데이터 읽기
메타데이터 DSL은 NavMetadataKey로 메타데이터 읽기를 간소화하는 함수도 제공합니다.
// import androidx.navigation3.runtime.contains // import androidx.navigation3.runtime.get val hasMyString: Boolean = metadata.contains(MySceneStrategy.MyStringMetadataKey) val myString: String? = metadata[MySceneStrategy.MyStringMetadataKey]