Eingabesicherheit in Kotlin DSL und Navigation Compose

Sie können integrierte typsichere APIs verwenden, um für Ihre Navigationsgrafik für Sicherheit bei der Kompilierungszeit zu sorgen. Diese APIs sind verfügbar, wenn Ihre Anwendung Navigation Compose oder Navigation Kotlin DSL verwendet. Sie sind ab dem Navigation 2.8.0 verfügbar.

Diese APIs entsprechen den Inhalten, die Safe Args für Navigationsdiagramme in integrierten Navigations-XML-Ressourcendateien bietet.

Routen definieren

Wenn Sie typsichere Routen in Compose verwenden möchten, müssen Sie zuerst serielle Klassen oder Objekte definieren, die Ihre Routen darstellen.

  • Objekt: 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 diese Option, wenn keine Argumente übergeben werden müssen, z. B. eine Klasse ohne Parameter oder eine Klasse, bei der alle Parameter Standardwerte haben.
    1. Beispiel: Profile::class

In beiden Fällen muss das Objekt oder die Klasse seriell sein.

Beispiele:

// 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)

Grafik erstellen

Als Nächstes müssen Sie Ihr Navigationsdiagramm definieren. Mit der Funktion composable() können Sie zusammensetzbare Funktionen als Ziele im Navigationsdiagramm 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() verwendet einen Typparameter. Das heißt: composable<Profile>.
  • Das Definieren des Zieltyps ist robuster als das Übergeben eines route-Strings wie in composable("profile").
  • Die Routenklasse definiert den Typ der einzelnen Navigationsargumente wie in val id: String, sodass NavArgument nicht erforderlich ist.
  • Für die Profilroute erstellt die Erweiterungsmethode toRoute() das Objekt Profile aus NavBackStackEntry und seinen Argumenten neu.

Weitere Informationen dazu, wie Sie Ihre Grafik im Allgemeinen entwerfen, finden Sie auf der Seite Navigationsgrafik entwerfen.

Schließlich können Sie mit der Funktion navigate() zur zusammensetzbaren Funktion wechseln. Dazu übergeben Sie die Instanz der Route:

navController.navigate(Profile(id = 123))

Dadurch wird der Nutzer im Navigationsdiagramm zum Ziel composable<Profile> weitergeleitet. Alle Navigationsargumente wie id können abgerufen werden, indem Profile mit NavBackStackEntry.toRoute rekonstruiert wird und seine Attribute gelesen werden.

Zusätzliche Ressourcen