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- Ad esempio:
Profile::class
- Ad esempio:
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. ovverocomposable<Profile>
.- La definizione del tipo di destinazione è un approccio più solido rispetto al passaggio di una stringa
route
come incomposable("profile")
. - La classe Route definisce il tipo di ogni argomento di navigazione, come in
val id: String
, quindi non è necessarioNavArgument
. - Per la route del profilo, il metodo di estensione
toRoute()
ricrea l'oggettoProfile
daNavBackStackEntry
e dai relativi argomenti.
Per ulteriori informazioni su come progettare il grafico in generale, consulta la pagina Progettare il grafico di navigazione.
Vai al percorso sicuro per i tipi
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à.