Seguridad de tipos en Kotlin DSL y Navigation Compose

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.
    1. Por ejemplo: Profile::class

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 en composable("profile").
  • La clase de ruta define el tipo de cada argumento de navegación, como en val id: String, por lo que no es necesario NavArgument.
  • Para la ruta de perfil, el método de extensión toRoute() recrea el objeto Profile a partir de NavBackStackEntry 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.

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.

Recursos adicionales