Dominando a navegação aninhada no Jetpack Compose

Tempo de leitura: 4 minutes

O Jetpack Compose, o moderno kit de ferramentas de interface do usuário do Google para desenvolvimento de aplicativos Android, revolucionou a maneira como criamos interfaces de usuário em aplicativos Android. Ele simplifica o desenvolvimento da interface do usuário, tornando-o mais intuitivo e eficiente. Um aspecto crucial da criação de aplicativos fáceis de usar é a navegação e, neste artigo, vamos nos aprofundar na navegação aninhada no Jetpack Compose, explorando seus conceitos e implementação, acompanhados de um exemplo detalhado do mundo real.

Entendendo a navegação aninhada

A navegação aninhada é um conceito essencial na criação de aplicativos Android complexos. Ela permite que você organize o fluxo do seu aplicativo dividindo-o em partes menores e gerenciáveis. Cada uma dessas partes pode ter seu gráfico de navegação, simplificando a estrutura geral do seu aplicativo e facilitando a manutenção.

No Jetpack Compose, você pode implementar a navegação aninhada usando os componentes NavHost e NavGraphBuilder da biblioteca Navigation Compose. A ideia principal é criar gráficos de navegação separados para diferentes seções ou recursos do seu aplicativo. Vamos explorar isso com um exemplo.

 

Criação de um aplicativo de anotações

Imagine que você está criando um aplicativo para fazer anotações. Você deseja ter um fluxo de navegação principal para criar e visualizar anotações, mas também deseja ter uma tela de configurações acessível de dentro do aplicativo. Esse é um cenário perfeito para a navegação aninhada.

Configurando o projeto

Primeiro, verifique se você tem as dependências necessárias para o Jetpack Compose e o Navigation Compose no arquivo build.gradle do seu projeto.

implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.navigation:navigation-compose:$nav_version"

Agora, vamos começar definindo nosso gráfico de navegação principal para criar e visualizar notas.

 

Gráfico de navegação primária

object NoteNavigation {
    const val MainRoute = "main"
    const val CreateNoteRoute = "create_note"
    const val ViewNoteRoute = "view_note"
}

Aqui, definimos três rotas: MainRoute, CreateNoteRoute e ViewNoteRoute para representar nossa tela principal, a tela de criação de notas e a tela de visualização de notas, respectivamente.

Em seguida, criamos uma função Composable para cada tela:

@Composable
fun MainScreen(navController: NavHostController) {
    // Main screen UI
}

@Composable
fun CreateNoteScreen(navController: NavHostController) {
    // Note creation screen UI
}

@Composable
fun ViewNoteScreen(navController: NavHostController, noteId: Int) {
    // Note viewing screen UI
}

Agora, vamos definir nosso gráfico de navegação principal:

@Composable
fun AppNavigation() {
    val navController = rememberNavController()

    NavHost(navController = navController, startDestination = NoteNavigation.MainRoute) {
        composable(route = NoteNavigation.MainRoute) {
            MainScreen(navController = navController)
        }
        composable(route = NoteNavigation.CreateNoteRoute) {
            CreateNoteScreen(navController = navController)
        }
        composable(
            route = "${NoteNavigation.ViewNoteRoute}/{noteId}",
            arguments = listOf(navArgument("noteId") { type = NavType.IntType })
        ) { entry ->
            val noteId = entry.arguments?.getInt("noteId") ?: -1
            ViewNoteScreen(navController = navController, noteId = noteId)
        }
    }
}

Aqui, configuramos nosso gráfico de navegação principal usando o NavHost, definindo rotas e Composables associados para cada tela. O parâmetro startDestination determina a tela inicial quando o aplicativo é iniciado.

 

Navegação aninhada para configurações

Agora, vamos adicionar navegação aninhada para a tela de configurações. Criaremos um gráfico de navegação separado para essa seção:

object SettingsNavigation {
    const val SettingsRoute = "settings"
    const val NotificationsRoute = "notifications"
    const val AppearanceRoute = "appearance"
}

Crie Composables para cada tela de configuração:

@Composable
fun SettingsScreen(navController: NavHostController) {
    // Settings screen UI
}

@Composable
fun NotificationsScreen(navController: NavHostController) {
    // Notifications settings UI
}

@Composable
fun AppearanceScreen(navController: NavHostController) {
    // Appearance settings UI
}

Agora, defina o gráfico de navegação aninhado para as configurações:

@Composable
fun SettingsNavigationGraph(navController: NavHostController) {
    NavHost(navController = navController, startDestination = SettingsNavigation.SettingsRoute) {
        composable(route = SettingsNavigation.SettingsRoute) {
            SettingsScreen(navController = navController)
        }
        composable(route = SettingsNavigation.NotificationsRoute) {
            NotificationsScreen(navController = navController)
        }
        composable(route = SettingsNavigation.AppearanceRoute) {
            AppearanceScreen(navController = navController)
        }
    }
}

 

Incorporação da navegação aninhada

Para incorporar a navegação aninhada em nosso aplicativo, adicionaremos um botão na MainScreen que navega até as configurações:

@Composable
fun MainScreen(navController: NavHostController) {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(text = "Welcome to My Notes App!")
        Spacer(modifier = Modifier.height(16.dp))
        Button(
            onClick = {
                navController.navigate(route = SettingsNavigation.SettingsRoute)
            }
        ) {
            Text(text = "Go to Settings")
        }
    }
}

Agora, você pode incluir o SettingsNavigationGraph Composable em seu AppNavigation:

@Composable
fun AppNavigation() {
    val navController = rememberNavController()

    NavHost(navController = navController, startDestination = NoteNavigation.MainRoute) {
        composable(route = NoteNavigation.MainRoute) {
            MainScreen(navController = navController)
        }
        composable(route = NoteNavigation.CreateNoteRoute) {
            CreateNoteScreen(navController = navController)
        }
        composable(
            route = "${NoteNavigation.ViewNoteRoute}/{noteId}",
            arguments = listOf(navArgument("noteId") { type = NavType.IntType })
        ) { entry ->
            val noteId = entry.arguments?.getInt("noteId") ?: -1
            ViewNoteScreen(navController = navController, noteId = noteId)
        }
        composable(route = SettingsNavigation.SettingsRoute) {
            SettingsNavigationGraph(navController = navController)
        }
    }
}

Com essa configuração, seu aplicativo agora suporta navegação aninhada. Você pode navegar da MainScreen para a SettingsScreen e navegar na seção de configurações com facilidade.

Conclusão

A navegação aninhada no Jetpack Compose é uma ferramenta poderosa para organizar e simplificar o fluxo de navegação do seu aplicativo. Ao criar gráficos de navegação separados para diferentes seções ou recursos do seu aplicativo, você pode aprimorar a experiência do usuário e tornar sua base de código mais fácil de manter. Neste artigo, exploramos o conceito de navegação aninhada e o implementamos em um exemplo real de um aplicativo de anotações.

À medida que você continuar a criar aplicativos complexos para Android com o Jetpack Compose, dominar a navegação aninhada será uma habilidade valiosa em seu kit de ferramentas. Ela permite que você crie aplicativos mais intuitivos e fáceis de usar e, ao mesmo tempo, mantenha sua base de código organizada e passível de manutenção. Boa codificação!