Safe Args

A maneira recomendada de navegar entre destinos é usar o plug-in Safe Args do Gradle. Esse plug-in gera classes de objetos e builders que permitem a navegação com segurança de tipos entre destinos. Use o Safe Args para navegar e transmitir dados entre destinos.

Ativar o Safe Args

Para adicionar Safe Args ao seu projeto, inclua o seguinte classpath no seu arquivo build.gradle de nível superior:

Groovy

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.8.0"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

Kotlin

buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.8.0"
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
    }
}

Você também precisa aplicar um dos dois plug-ins disponíveis.

Para gerar um código de linguagem Java adequado para módulos Java ou Java e Kotlin mistos, adicione esta linha ao arquivo build.gradle do seu app ou módulo:

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

plugins {
    id("androidx.navigation.safeargs")
}

Como alternativa, para gerar o código Kotlin adequado para módulos somente Kotlin, adicione:

Groovy

plugins {
  id 'androidx.navigation.safeargs.kotlin'
}

Kotlin

plugins {
    id("androidx.navigation.safeargs.kotlin")
}

Você precisa ter android.useAndroidX=true no arquivo gradle.properties, como mostrado em Migrar para o AndroidX.

Código gerado

Depois de ativar o Safe Args, o código gerado contém classes e métodos para cada ação definida, bem como classes correspondentes a cada destino de envio e recebimento.

O Safe Args gera uma classe para cada destino de origem de uma ação. O nome da classe gerada adiciona "Directions" ao nome da classe de destino de origem. Por exemplo, se o destino de origem tem o nome de SpecifyAmountFragment, a classe gerada será chamada SpecifyAmountFragmentDirections.

A classe gerada contém um método estático para cada ação definida no destino de origem. Esse método usa qualquer parâmetro de ação definido como argumento e retorna um objeto NavDirections que você pode transmitir diretamente para navigate().

Exemplo de Safe Args

Por exemplo, considere um gráfico de navegação com uma única ação que conecta dois destinos, SpecifyAmountFragment e ConfirmationFragment. O ConfirmationFragment usa um único parâmetro float fornecido como parte da ação.

O Safe Args gera uma classe SpecifyAmountFragmentDirections com um único método, actionSpecifyAmountFragmentToConfirmationFragment(), e uma classe interna chamada ActionSpecifyAmountFragmentToConfirmationFragment. A classe interna é derivada de NavDirections e armazena o ID de ação associado e o parâmetro float. O objeto NavDirections retornado pode ser transmitido diretamente para navigate(), conforme mostrado no exemplo a seguir.

Kotlin

override fun onClick(v: View) {
    val amount: Float = ...
    val action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment(amount)
    v.findNavController().navigate(action)
}

Java

@Override
public void onClick(View view) {
    float amount = ...;
    action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment(amount);
    Navigation.findNavController(view).navigate(action);
}

Para conferir mais informações sobre como transmitir dados entre destinos com o Safe Args, consulte Usar o Safe Args para transmitir dados com segurança de tipos.

Garantir a segurança de tipos usando Safe Args

Navegue entre destinos usando o plug-in Safe Args do Gradle. Esse plug-in gera classes de builders e objetos simples que permitem transmitir argumentos e fazer a navegação com segurança de tipos entre destinos.

Para adicionar Safe Args ao seu projeto, inclua o seguinte classpath no seu arquivo build.gradle de nível superior:

Groovy

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.8.0"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

Kotlin

buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.8.0"
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
    }
}

Você também precisa aplicar um dos dois plug-ins disponíveis.

Para gerar um código de linguagem Java adequado para módulos Java ou Java e Kotlin mistos, adicione esta linha ao arquivo build.gradle do seu app ou módulo:

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

plugins {
    id("androidx.navigation.safeargs")
}

Como alternativa, para gerar o código Kotlin adequado para módulos somente Kotlin, adicione:

Groovy

plugins {
  id 'androidx.navigation.safeargs.kotlin'
}

Kotlin

plugins {
    id("androidx.navigation.safeargs.kotlin")
}

Você precisa ter android.useAndroidX=true no arquivo gradle.properties, como mostrado em Migrar para o AndroidX.

Depois que o plug-in Safe Args é ativado, ele gera um código que contém classes e métodos para cada ação que você definiu. Para cada ação, o Safe Args também gerará uma classe para cada destino de origem, que é o destino de origem da ação. O nome da classe gerada é uma combinação do nome da classe de destino de origem e da palavra "Directions". Por exemplo, se o destino tem o nome de SpecifyAmountFragment, a classe gerada terá o nome SpecifyAmountFragmentDirections. A classe gerada contém um método estático para cada ação definida no destino de origem. Esse método usa qualquer parâmetro de ação definido como argumento e retorna um objeto NavDirections que você pode transmitir para navigate().

Como exemplo, vamos supor que temos um gráfico de navegação com uma única ação que conecta o destino de origem, SpecifyAmountFragment, a um destino de recebimento, ConfirmationFragment.

O Safe Args gera uma classe SpecifyAmountFragmentDirections com um único método, actionSpecifyAmountFragmentToConfirmationFragment(), que retorna um objeto NavDirections. Esse objeto NavDirections retornado pode ser transmitido diretamente para navigate(), como mostrado no exemplo abaixo.

Kotlin

override fun onClick(view: View) {
    val action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment()
    view.findNavController().navigate(action)
}

Java

@Override
public void onClick(View view) {
    NavDirections action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment();
    Navigation.findNavController(view).navigate(action);
}

Para mais informações sobre como transmitir dados entre destinos com o Safe Args, consulte Usar o Safe Args para transmitir dados com segurança de tipos em Transmitir dados entre destinos.