In Navigation 3 verwenden Sie Metadaten, um beliebige Informationen zwischen verschiedenen Bibliothekskomponenten wie NavEntry, Scene und NavDisplay auszutauschen. Im Grunde sind Metadaten eine Map<String, Any>.
Die Bibliothek bietet jedoch zusätzliche Abstraktionen, um das Lesen und Schreiben von Metadaten zu vereinfachen und typsicherer zu machen.
Metadaten für NavEntry bereitstellen
Wenn Ihre App 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 App das entryProvider-DSL verwendet, geben Sie Metadaten über den Parameter metadata der Funktion entry an. Es gibt zwei Überladungen dieser Funktion: eine, die direkt eine Map verwendet, und eine, die eine Lambda-Funktion verwendet, die 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})") }) { /* ... */ }
Metadaten für Scene bereitstellen
Standardmäßig verwendet Scene.metadata einen benutzerdefinierten Getter, der die metadata des letzten Eintrags in der Eigenschaft entries zurückgibt. Wenn diese null ist, wird eine leere Karte zurückgegeben. Wenn Sie die Scene-Schnittstelle implementieren, können Sie dieses Standardverhalten nach Bedarf überschreiben.
Metadaten-DSL verwenden
Die in der 1.1.0-beta01-Version der Bibliothek eingeführte domänenspezifische Sprache (DSL) für Metadaten bietet einen typsicheren Builder zum Erstellen der Map<String, Any>, die zum Speichern von Metadaten verwendet wird.
Metadatenschlüssel definieren
Die DSL verwendet die NavMetadataKey-Schnittstelle, um den Typ des Werts, der einem Metadatenschlüssel zugeordnet ist, konsistent zu halten.
Die Konvention zum Definieren 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 Werte liest, die mit diesen Schlüsseln verknüpft sind:
// 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 die Funktion metadata, die einen Lambda-Parameter akzeptiert, um eine Metadatenzuordnung zu erstellen. Verwenden Sie in diesem Lambda die Funktion put, um dem Map Einträge mit einem NavMetadataKey und dem 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 mit Metadatenschlüsseln lesen
Die Metadaten-DSL bietet auch Funktionen, um das Lesen von Metadaten mit einem NavMetadataKey zu vereinfachen.
// import androidx.navigation3.runtime.contains // import androidx.navigation3.runtime.get val hasMyString: Boolean = metadata.contains(MySceneStrategy.MyStringMetadataKey) val myString: String? = metadata[MySceneStrategy.MyStringMetadataKey]