Sicurezza dei tipi in Kotlin DSL e Navigation Compose

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

Queste API equivalgono a ciò che Args sicuri fornisce ai grafici di navigazione, i file di risorse XML di navigazione integrati

Definisci route

Per utilizzare route sicure per tipo in Compose, devi prima definire classi o oggetti serializzabili che rappresentano le 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>: utilizza questa opzione se non devi trasferire argomenti come una classe senza parametri o una classe in cui tutti i parametri hanno valori predefiniti
    1. Ad esempio: Profile::class

In entrambi i casi, l'oggetto o la classe deve essere serializzabile.

Ecco alcuni esempi:

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

Creare il grafico

Poi devi definire il grafico di navigazione. Utilizza la funzione composable() per definire i 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)
     }
}

Osserva quanto segue in questo esempio:

  • composable() richiede un parametro di tipo. Vale a dire: composable<Profile>.
  • La definizione del tipo di destinazione è un approccio più solido rispetto al trasferimento di una stringa di route come in composable("profile").
  • La classe di route definisce il tipo di ciascun argomento di navigazione, come in val id: String, quindi non è necessario utilizzare NavArgument.
  • Per la route del profilo, il metodo dell'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 Progetta il grafico di navigazione.

Infine, puoi accedere al componibile 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, come id, può essere ottenuto ricostruendo Profile utilizzando NavBackStackEntry.toRoute e leggendo le sue proprietà.

Risorse aggiuntive