Sicurezza dei tipi in Kotlin DSL e Navigation Compose

Puoi utilizzare API sicure per i tipi integrate per garantire la sicurezza del tipo in fase di compilazione per il tuo gráfo di navigazione. Queste API sono disponibili quando la tua app utilizza Navigation Compose o Navigation Kotlin DSL. Sono disponibili a partire dal giorno Navigation 2.8.0.

Queste API sono equivalenti a quanto fornito da Safe Args ai grafici di navigazione costruiti utilizzando XML.

Definire le route

Per utilizzare route sicure dal punto di vista del tipo in Compose, devi prima definire classi o oggetti serializzabili che rappresentano le route.

Per definire oggetti serializzabili, utilizza l'annotazione @Serializable fornita dal plug-in di serializzazione Kotlin. Questo plug-in può essere aggiunto al progetto aggiungendo queste dipendenze.

Utilizza le seguenti regole per decidere quale tipo utilizzare per il tuo percorso:

  • 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 è necessario 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 tutti i casi, 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 grafico

A questo punto devi definire il grafo di navigazione. Utilizza la funzione composable() per definire i composabili 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, tieni presente quanto segue:

  • composable() accetta un parametro di tipo. ovvero composable<Profile>.
  • La definizione del tipo di destinazione è un approccio più solido rispetto al passaggio di una stringa route come in composable("profile").
  • La classe Route definisce il tipo di ogni argomento di navigazione, come in val id: String, quindi non è necessario NavArgument.
  • Per la route del profilo, il metodo di estensione toRoute() ricrea l'oggetto Profile da NavBackStackEntry e dai relativi argomenti.

Per ulteriori informazioni su come progettare il grafico in generale, consulta la pagina Progettare il grafico di navigazione.

Infine, puoi passare al tuo composable utilizzando la funzione navigate() passando l'istanza della route:

navController.navigate(Profile(id = 123))

L'utente viene indirizzato alla destinazione composable<Profile> nel grafico di navigazione. Qualsiasi argomento di navigazione, ad esempio id, può essere ottenuto rigenerando Profile utilizzando NavBackStackEntry.toRoute e leggendo le sue proprietà.

Risorse aggiuntive