В Navigation 3 метаданные используются для обмена произвольной информацией между различными компонентами библиотеки, такими как NavEntry, Scene и NavDisplay. В самом простом виде метаданные – это Map<String, Any>.
Однако библиотека предоставляет дополнительные абстракции, которые упрощают чтение и запись метаданных и повышают типобезопасность.
Добавьте метаданные NavEntry.
Если ваше приложение создает экземпляры NavEntry напрямую, вы можете предоставить метаданные для записи, используя параметр конструктора metadata:
when (key) { is Home -> NavEntry(key, metadata = mapOf("key" to "value")) {} }
Если ваше приложение использует DSL entryProvider, вы предоставляете метаданные через параметр metadata функции entry. У этой функции есть две перегрузки: одна принимает карту напрямую, а другая – лямбда-выражение, которое передает ключ записи в качестве аргумента:
entry<Home>(metadata = mapOf("key" to "value")) { /* ... */ } entry<Conversation>(metadata = { key: Conversation -> mapOf("key" to "value: ${key.id})") }) { /* ... */ }
Добавьте метаданные Scene.
По умолчанию Scene.metadata использует пользовательский метод получения, который возвращает metadata последней записи в свойстве entries или пустую карту, если это null. При реализации интерфейса Scene вы можете переопределить этот режим работы по умолчанию.
Используйте DSL метаданных
В версии 1.1.0-beta01 библиотеки появился предметно-ориентированный язык (DSL) метаданных, который предоставляет типобезопасный конструктор для создания Map<String, Any>, используемого для хранения метаданных.
Как определить ключи метаданных
DSL использует интерфейс NavMetadataKey, чтобы тип значения, связанного с ключом метаданных, оставался неизменным.
Ключи метаданных принято определять как вложенные объекты класса или, в случае функций или composable-функций, как связанный объект, который будет считывать значения, связанные с этими ключами:
// 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, которая принимает параметр lambda. Внутри лямбда-выражения используйте функцию 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]