In Navigation 3 verwenden Sie Metadaten, um beliebige Informationen zwischen verschiedenen Bibliothekskomponenten wie NavEntry, Scene und NavDisplay zu teilen. Im Grunde sind Metadaten ein Map<String, Any>.
Die Bibliothek bietet jedoch zusätzliche Abstraktionen, um das Lesen und Schreiben von Metadaten einfacher und typsicherer zu machen.
NavEntry-Metadaten bereitstellen
Wenn Ihre Anwendung die NavEntry-Instanzen direkt erstellt, geben Sie Metadaten für den Eintrag mit dem Konstruktorparameter metadata an:
when (key) { is Home -> NavEntry(key, metadata = mapOf("key" to "value")) {} }
Wenn Ihre Anwendung die entryProvider-DSL verwendet, stellen Sie Metadaten über den Parameter metadata der Funktion entry bereit. Es gibt zwei Überladungen dieser Funktion: eine, die eine Map direkt annimmt, und eine, die ein Lambda annimmt, das den Schlüssel des Eintrags als Argument übergibt:
entry<Home>(metadata = mapOf("key" to "value")) { /* ... */ } entry<Conversation>(metadata = { key: Conversation -> mapOf("key" to "value: ${key.id})") }) { /* ... */ }
Scene-Metadaten bereitstellen
Standardmäßig verwendet Scene.metadata einen benutzerdefinierten Getter, der die metadata des letzten Eintrags in der Property entries oder eine leere Zuordnung zurückgibt, wenn diese null ist. Wenn Sie die Scene-Schnittstelle implementieren, können Sie dieses Standardverhalten nach Bedarf überschreiben.
Metadaten-DSL verwenden
Die domänenspezifische Sprache (DSL) für Metadaten wurde in der Version 1.1.0-beta01 der Bibliothek eingeführt und bietet einen typsicheren Builder zum Erstellen des Map<String, Any>, der zum Speichern von Metadaten verwendet wird.
Metadatenschlüssel definieren
Die DSL verwendet die Schnittstelle NavMetadataKey, um den Typ des Werts, der einem Metadatenschlüssel zugeordnet ist, konsistent zu halten.
Die Konvention für die Definition von Metadatenschlüsseln besteht darin, sie als verschachtelte Objekte der Klasse oder, im Fall von Funktionen oder Composables, als zugehöriges Objekt einzufügen, das die mit diesen Schlüsseln verknüpften Werte liest:
// 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> }
Metadaten mit der DSL erstellen
Verwenden Sie zum Erstellen einer Metadatenzuordnung die Funktion metadata, die einen Lambda-Parameter akzeptiert. Verwenden Sie in diesem Lambda die Funktion put, um der Karte Einträge mit einem NavMetadataKey und einem entsprechenden Wert hinzuzufügen.
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!") } } ) { // ... }
Metadaten mithilfe von Metadatenschlüsseln lesen
Die Metadaten-DSL bietet auch Funktionen, mit denen das Lesen von Metadaten mit einem NavMetadataKey vereinfacht wird.
// import androidx.navigation3.runtime.contains // import androidx.navigation3.runtime.get val hasMyString: Boolean = metadata.contains(MySceneStrategy.MyStringMetadataKey) val myString: String? = metadata[MySceneStrategy.MyStringMetadataKey]