Sicurezza dei tipi in Kotlin DSL e Navigation Compose

Puoi utilizzare le API integrate sicure per la sicurezza dei tipi per garantire la sicurezza del tipo in fase di compilazione grafico di navigazione. Queste API sono disponibili quando la tua app utilizza il Navigatore Compose o Navigator Kotlin DSL. Sono disponibili dal giorno Navigation 2.8.0.

Queste API corrispondono alle funzionalità fornite dagli argomenti sicuri per i grafici di navigazione creati utilizzando XML.

Definisci route

Per utilizzare route sicure per il tipo in Compose, devi prima definire la possibilità di serializzare che rappresentano le tue route.

  • Oggetto: utilizza un oggetto per le route senza argomenti.
  • Classe: utilizza una classe o una classe di dati per le route con argomenti.
  • KClass<T>: da utilizzare se non devi passare argomenti, ad esempio una classe senza parametri o una classe in cui tutti i parametri hanno valori predefiniti
    1. Ad esempio: Profile::class

In ogni caso, l'oggetto o la classe deve essere serializzabile.

Ad esempio:

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

Crea il tuo grafico

Poi devi definire il grafico di navigazione. Utilizza la composable() per definire gli elementi componibili come destinazioni nel grafico di navigazione.

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

In questo esempio, osserva quanto segue:

  • composable() richiede un parametro di tipo. Vale a dire che composable<Profile>.
  • La definizione del tipo di destinazione è un approccio più efficace rispetto al passaggio di una route string come in composable("profile").
  • La classe route definisce il tipo di ogni argomento di navigazione, ad esempio val id: String, quindi NavArgument non è necessario.
  • Per la route del profilo, il metodo di estensione toRoute() ricrea il valore Profile oggetto da NavBackStackEntry e dai relativi argomenti.

Per ulteriori informazioni su come progettare il tuo grafico in generale, consulta la sezione Progettazione pagina del grafico di navigazione.

Infine, puoi accedere al componibile utilizzando navigate() passando l'istanza della route:

navController.navigate(Profile(id = 123))

L'utente viene indirizzato alla destinazione composable<Profile> in grafico di navigazione. Eventuali argomenti di navigazione, ad esempio id, possono essere ottenuti ricostruire Profile utilizzando NavBackStackEntry.toRoute e leggerne proprietà.

Risorse aggiuntive