Makrosites

Suas ideias em realidade digital!

Navigation Component no Android: guia completo com Safe Args e BackStack

Navigation Component no Android: guia completo com Safe Args e BackStack

O que é Navigation Component?

Navigation Component é a biblioteca oficial do Android Jetpack para gerenciar navegação entre Fragments. Ela resolve problemas clássicos como:


1️⃣ Adicionando dependência

implementation "androidx.navigation:navigation-fragment-ktx:2.7.7"
implementation "androidx.navigation:navigation-ui-ktx:2.7.7"
Se usar Safe Args:
plugins {
    id "androidx.navigation.safeargs.kotlin"
}

2️⃣ Criando o nav_graph.xml

Crie em: res/navigation/nav_graph.xml

<navigation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.HomeFragment"
        android:label="Home">

        <action
            android:id="@+id/action_home_to_detail"
            app:destination="@id/detailFragment"/>

    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.DetailFragment"
        android:label="Detail"/>

</navigation>

3️⃣ Adicionando NavHost

No layout da Activity:
<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/nav_graph"
    app:defaultNavHost="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

4️⃣ Navegando entre fragments

findNavController()
    .navigate(R.id.action_home_to_detail)
Muito mais simples que FragmentTransaction manual.

5️⃣ Passando argumentos com Safe Args

No nav_graph:
<fragment
    android:id="@+id/detailFragment"
    android:name="com.example.DetailFragment">

    <argument
        android:name="userId"
        app:argType="integer"/>

</fragment>
Navegação:
val action = HomeFragmentDirections
    .actionHomeToDetail(userId = 10)

findNavController().navigate(action)
Recebendo no DetailFragment:
val args: DetailFragmentArgs by navArgs()
val id = args.userId
Safe Args evita erros de tipo.

6️⃣ Controle do BackStack

Remover tela anterior:
findNavController().navigate(
    R.id.homeFragment,
    null,
    NavOptions.Builder()
        .setPopUpTo(R.id.loginFragment, true)
        .build()
)
Muito usado após login.

Boas práticas profissionais


Integração com arquitetura moderna

Navigation combina perfeitamente com: