Sûreté du typage dans le DSL Kotlin et Navigation Compose

Vous pouvez utiliser des API intégrées avec sûreté du typage pour assurer la sûreté du typage au moment de la compilation de votre graphique de navigation. Ces API sont disponibles lorsque votre application utilise Navigation Compose ou le DSL Kotlin de navigation. Ils sont disponibles à partir du Navigation 2.8.0.

Ces API sont équivalentes à ce que Safe Args fournit aux fichiers de ressources XML de navigation intégrés aux graphiques de navigation.

Définir des routes

Pour utiliser des routes avec sûreté du typage dans Compose, vous devez d'abord définir des classes ou des objets sérialisables qui représentent vos routes.

  • Object (Objet) : utilisez un objet pour les routes sans arguments.
  • Class (Classe) : utilisez une classe ou une classe de données pour les routes avec des arguments.
  • KClass<T>: à utiliser si vous n'avez pas besoin de transmettre d'arguments, comme une classe sans paramètres ou une classe dont tous les paramètres ont des valeurs par défaut
    1. Par exemple : Profile::class

Dans les deux cas, l'objet ou la classe doit être sérialisable.

Par exemple :

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

Créer votre graphique

Vous devez ensuite définir votre graphique de navigation. Utilisez la fonction composable() pour définir des composables en tant que destinations dans votre graphique de navigation.

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen( id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

Observez les points suivants dans cet exemple:

  • composable() utilise un paramètre de type. Autrement dit, composable<Profile>.
  • Définir le type de destination est une approche plus robuste que de transmettre une chaîne route, comme dans composable("profile").
  • La classe de route définit le type de chaque argument de navigation, comme dans val id: String. Il n'est donc pas nécessaire d'utiliser NavArgument.
  • Pour la route de profil, la méthode d'extension toRoute() recrée l'objet Profile à partir de NavBackStackEntry et de ses arguments.

Pour en savoir plus sur la conception générale de votre graphique, consultez la page Concevoir votre graphique de navigation.

Enfin, vous pouvez accéder à votre composable à l'aide de la fonction navigate() en transmettant l'instance de la route:

navController.navigate(Profile(id = 123))

L'utilisateur est redirigé vers la destination composable<Profile> dans le graphique de navigation. Tous les arguments de navigation, tels que id, peuvent être obtenus en reconstruisant Profile à l'aide de NavBackStackEntry.toRoute et en lisant ses propriétés.

Ressources supplémentaires