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

Você pode usar APIs de tipo seguro integradas para oferecer segurança de tipos no momento da compilação ao gráfico de navegação. Essas APIs estão disponíveis quando o app usa o Navigation Compose 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 fornece para os gráficos de navegação integrados aos arquivos de recursos 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.

  • Object: use um objeto para rotas sem argumentos.
  • Class: 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 têm valores padrão.
    1. Por exemplo: Profile::class

Em ambos os casos, o objeto ou a classe precisa ser serializável.

Por 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 seu gráfico

Em seguida, você precisa definir seu 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. Portanto, 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 dos argumentos dele.

Para mais informações sobre como projetar seu gráfico em geral, consulte a página Criar o 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. Todos os argumentos de navegação, como id, podem ser recebidos reconstruindo Profile usando NavBackStackEntry.toRoute e lendo as propriedades dele.

Outros recursos