Sie können integrierte typsichere APIs verwenden, um für Ihren Navigationsgraphen eine typsichere Kompilierung zu ermöglichen. Diese APIs sind verfügbar, wenn Ihre App Navigation Compose oder Navigation Kotlin DSL verwendet. Sie sind seit dem Navigation
2.8.0
verfügbar.
Diese APIs entsprechen dem, was Safe Args für Navigationsgraphen bietet, die mit XML erstellt wurden.
Routen definieren
Wenn Sie typsichere Routen in Compose verwenden möchten, müssen Sie zuerst serialisierbare Klassen oder Objekte definieren, die Ihre Routen darstellen.
Verwenden Sie zum Definieren serialisierbarer Objekte die @Serializable
-Anmerkung, die vom Kotlin-Serialisierungs-Plug-in bereitgestellt wird.
Sie können dieses Plug-in Ihrem Projekt hinzufügen, indem Sie diese Abhängigkeiten hinzufügen.
Anhand der folgenden Regeln können Sie entscheiden, welchen Typ Sie für Ihre Route verwenden möchten:
- Object: Verwenden Sie ein Objekt für Routen ohne Argumente.
- Klasse: Verwenden Sie eine Klasse oder Datenklasse für Routen mit Argumenten.
KClass<T>
: Verwenden Sie diesen Parameter, wenn Sie keine Argumente übergeben müssen, z. B. für eine Klasse ohne Parameter oder eine Klasse, bei der alle Parameter Standardwerte haben.- Beispiel:
Profile::class
- Beispiel:
In allen Fällen muss das Objekt oder die Klasse serialisierbar sein.
Beispiel:
// Define a home route that doesn't take any arguments
@Serializable
object Home
// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)
Diagramm erstellen
Als Nächstes müssen Sie Ihren Navigationsgraphen definieren. Verwenden Sie die Funktion composable()
, um Elemente als Ziele in Ihrem Navigationsgraphen zu definieren.
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile.id)
}
}
Beachten Sie in diesem Beispiel Folgendes:
composable()
nimmt einen Typparameter an. Der Wert istcomposable<Profile>
.- Das Definieren des Zieltyps ist ein robusterer Ansatz als das Übergeben eines Strings vom Typ
route
wie incomposable("profile")
. - Die Routenklasse definiert den Typ jedes Navigationsarguments, wie in
val id: String
.NavArgument
ist daher nicht erforderlich. - Für die Profilroute erstellt die
toRoute()
-Erweiterungsmethode dasProfile
-Objekt ausNavBackStackEntry
und seinen Argumenten neu.
Weitere Informationen zum Erstellen von Navigationsdiagrammen finden Sie auf der Seite Navigationsdiagramm erstellen.
Zu einer sicheren Route für die Eingabe von Text gehen
Schließlich können Sie mit der Funktion navigate()
zur Zusammenstellung wechseln, indem Sie die Instanz der Route übergeben:
navController.navigate(Profile(id = 123))
Dadurch gelangt der Nutzer zum Ziel composable<Profile>
im Navigationsgraphen. Navigationsargumente wie id
können abgerufen werden, indem Profile
mithilfe von NavBackStackEntry.toRoute
rekonstruiert und die Eigenschaften gelesen werden.