É possível usar APIs integradas com segurança de tipo para fornecer segurança de tipo no tempo de compilação para seu
gráfico de navegação. Essas APIs estão disponíveis quando o app usa o Compose
de navegação ou a DSL de navegação do Kotlin. Eles estão disponíveis a partir de Navigation
2.8.0
.
Essas APIs são equivalentes ao que o Safe Args oferece aos gráficos de navegação criados usando XML.
Definir rotas
Para usar rotas com segurança de tipo no Compose, primeiro é necessário definir classes ou objetos serializáveis que representem suas rotas.
Para definir objetos serializáveis, use a anotação @Serializable
fornecida pelo
plug-in de serialização do Kotlin.
Para adicionar esse plug-in ao projeto, adicione estas
dependências.
Use as regras a seguir para decidir qual tipo usar no seu trajeto:
- Objeto: use um objeto para rotas sem argumentos.
- Classe: use uma classe ou classe de dados para rotas com argumentos.
KClass<T>
: use se você não precisar transmitir argumentos, como uma classe sem parâmetros ou uma classe em que todos os parâmetros tenham valores padrão- Por exemplo:
Profile::class
- Por exemplo:
Em todos os casos, o objeto ou a classe precisa ser serializável.
Exemplo:
// 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)
Criar o gráfico
Em seguida, você precisa definir o gráfico de navegação. Use a função composable()
para definir elementos combináveis como destinos no gráfico de navegação.
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile.id)
}
}
Observe o seguinte neste exemplo:
composable()
usa um parâmetro de tipo. Ou seja,composable<Profile>
.- Definir o tipo de destino é uma abordagem mais robusta do que transmitir uma
string
route
, como emcomposable("profile")
. - A classe de rota define o tipo de cada argumento de navegação, como em
val id: String
, então não é necessário usarNavArgument
. - Para a rota de perfil, o método de extensão
toRoute()
recria o objetoProfile
doNavBackStackEntry
e seus argumentos.
Para mais informações sobre como projetar seu gráfico em geral, consulte a página Projetar seu gráfico de navegação.
Navegar até a rota segura de tipos
Por fim, você pode navegar até o elemento combinável usando a função navigate()
transmitindo a instância da rota:
navController.navigate(Profile(id = 123))
Isso leva o usuário ao destino composable<Profile>
no
gráfico de navegação. Qualquer argumento de navegação, como id
, pode ser obtido
reconstruindo Profile
usando NavBackStackEntry.toRoute
e lendo as
propriedades.