Puedes usar APIs integradas de tipo seguro para proporcionar seguridad de tipos de tiempo de compilación para tu gráfico de navegación. Estas APIs están disponibles cuando tu app usa Navigation Compose o el DSL de Kotlin de Navigation. Están disponibles a partir del Navigation
2.8.0
.
Estas APIs son equivalentes a lo que Safe Args proporciona a los gráficos de navegación compilados con XML.
Define rutas
Para usar rutas seguras para tipos en Compose, primero debes definir clases o objetos serializables que representen tus rutas.
Para definir objetos serializables, usa la anotación @Serializable
que proporciona el complemento de serialización de Kotlin.
Para agregar este complemento a tu proyecto, agrega estas dependencias.
Usa las siguientes reglas para decidir qué tipo usar para tu ruta:
- Objeto: Usa un objeto para rutas sin argumentos.
- Clase: Usa una clase o una clase de datos para las rutas con argumentos.
KClass<T>
: Úsalo si no necesitas pasar argumentos, como una clase sin parámetros o una clase en la que todos los parámetros tienen valores predeterminados.- Por ejemplo:
Profile::class
- Por ejemplo:
En todos los casos, el objeto o la clase deben ser serializables.
Por ejemplo:
// 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)
Compila tu gráfico
A continuación, debes definir tu gráfico de navegación. Usa la función composable()
para definir elementos componibles como destinos en tu gráfico de navegación.
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile.id)
}
}
Observa lo siguiente en este ejemplo:
composable()
toma un parámetro de tipo. Es decir,composable<Profile>
.- Definir el tipo de destino es un enfoque más sólido que pasar una cadena
route
como encomposable("profile")
. - La clase de ruta define el tipo de cada argumento de navegación, como en
val id: String
, por lo que no es necesarioNavArgument
. - Para la ruta de perfil, el método de extensión
toRoute()
recrea el objetoProfile
a partir deNavBackStackEntry
y sus argumentos.
Para obtener más información sobre cómo diseñar tu gráfico en general, consulta la página Cómo diseñar tu gráfico de navegación.
Cómo navegar a una ruta de tipo seguro
Por último, puedes navegar a tu elemento componible con la función navigate()
pasando la instancia de la ruta:
navController.navigate(Profile(id = 123))
Esto lleva al usuario al destino composable<Profile>
en el gráfico de navegación. Cualquier argumento de navegación, como id
, se puede obtener reconstruyendo Profile
con NavBackStackEntry.toRoute
y leyendo sus propiedades.