Настройте свое приложение с помощью метаданных.

В 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 для обеспечения согласованности типа значения, связанного с ключом метаданных.

Принято определять ключи метаданных, включив их в качестве вложенных объектов класса — или, в случае функций или компонуемых объектов, в связанный объект, — который будет считывать значения, связанные с этими ключами:

// 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`. Внутри этой функции `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]