Seguridad de tipos en Kotlin DSL y Navigation Compose

Puedes usar APIs de tipos seguros integradas 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 la 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 a los archivos de recursos XML de navegación integrados.

Define las rutas

Para usar rutas de tipo seguro en Compose, primero debes definir objetos o clases serializables que representen tus rutas.

  • Object: Usa un objeto para rutas sin argumentos.
  • Clase: Usa una clase o clase de datos para las rutas con argumentos.
  • KClass<T>: Úsala si no necesitas pasar argumentos, como una clase sin parámetros o una clase en la que todos los parámetros tengan valores predeterminados.
    1. Por ejemplo: Profile::class

En cualquier caso, 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 string 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 usar NavArgument.
  • Para la ruta de perfil, el método de extensión toRoute() recrea el objeto Profile a partir de NavBackStackEntry y sus argumentos.

Si deseas obtener más información para 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 al 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 si se reconstruye Profile mediante NavBackStackEntry.toRoute y se leen sus propiedades.

Recursos adicionales