Segurança de tipo na DSL do Kotlin e no Navigation Compose

É 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
    1. Por exemplo: Profile::class

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 em composable("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 usar NavArgument.
  • Para a rota de perfil, o método de extensão toRoute() recria o objeto Profile do NavBackStackEntry 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.

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.

Outros recursos