Safe Args

Para navegar entre destinos, te recomendamos que uses el complemento Safe Args de Gradle, que genera clases de objetos y compiladores que permiten la navegación de tipo seguro entre destinos. Usa Safe Args para navegar y pasar datos entre destinos.

Cómo habilitar Safe Args

Para agregar Safe Args a tu proyecto, incluye la siguiente classpath en tu archivo build.gradle de nivel 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")
    }
}

También debes aplicar uno de los dos complementos disponibles.

Para generar código de lenguaje Java adecuado para Java o módulos combinados de Java y Kotlin, agrega esta línea al archivo build.gradle de tu app o módulo:

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

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

Como alternativa, para generar el código de Kotlin adecuado para módulos solo de Kotlin, agrega lo siguiente:

Groovy

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

Kotlin

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

Tienes que tener el objeto android.useAndroidX=true en tu archivo gradle.properties, según se indica en Cómo migrar a AndroidX.

Código generado

Después de que habilites Safe Args, tu código generado contendrá clases y métodos para cada acción que hayas definido, además de clases que correspondan a cada destino de envío y recepción.

Safe Args genera una clase para cada destino en el que se origina una acción. Al nombre de la clase de destino de origen se le agrega "Directions". Por ejemplo, si el destino de origen tiene el nombre SpecifyAmountFragment, la clase generada se llamará SpecifyAmountFragmentDirections.

La clase generada contiene un método estático para cada acción definida en el destino de origen, que toma cualquier parámetro de acción definido como argumento y muestra un objeto NavDirections que puedes pasar directamente a navigate().

Ejemplo de Safe Args

Por ejemplo, imagina un gráfico de navegación con una sola acción que conecta dos destinos: SpecifyAmountFragment y ConfirmationFragment. ConfirmationFragment toma un solo parámetro float que proporcionas como parte de la acción.

Safe Args genera una clase SpecifyAmountFragmentDirections con un solo método, actionSpecifyAmountFragmentToConfirmationFragment(), y una clase interna llamada ActionSpecifyAmountFragmentToConfirmationFragment. La clase interna deriva de NavDirections y almacena el ID de acción asociado y el parámetro float. Luego, el objeto NavDirections que se muestra se puede pasar directamente a navigate(), como se ve en el siguiente ejemplo:

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);
}

Si quieres obtener más información para pasar datos entre destinos con Safe Args, consulta Cómo usar Safe Args para pasar datos con seguridad de tipo.

Cómo garantizar la seguridad de tipo con Safe Args

Navega entre destinos con el complemento de Gradle Safe Args. Este complemento genera clases de objetos y compiladores simples que permiten navegar con seguridad de tipo y pasar argumentos entre destinos.

Para agregar Safe Args a tu proyecto, incluye la siguiente classpath en tu archivo build.gradle de nivel 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")
    }
}

También debes aplicar uno de los dos complementos disponibles.

Para generar código de lenguaje Java adecuado para Java o módulos combinados de Java y Kotlin, agrega esta línea al archivo build.gradle de tu app o módulo:

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

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

Como alternativa, para generar el código de Kotlin adecuado para módulos solo de Kotlin, agrega lo siguiente:

Groovy

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

Kotlin

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

Tienes que tener el objeto android.useAndroidX=true en tu archivo gradle.properties, según se indica en Cómo migrar a AndroidX.

Después de habilitar Safe Args, el complemento genera código que contiene clases y métodos para cada acción que definiste. En cada acción, Safe Args también genera una clase para cada destino de origen, que es el destino desde el que se origina la acción. El nombre de clase generado es una combinación del nombre de clase del destino de origen y la palabra "Directions". Por ejemplo, si el destino se llama SpecifyAmountFragment, la clase generada se llama SpecifyAmountFragmentDirections. La clase generada contiene un método estático para cada acción definida en el destino de origen, que toma cualquier parámetro de acción definido como argumento y muestra un objeto NavDirections que puedes pasar a navigate().

Como ejemplo, imagina que tienes un gráfico de navegación con una sola acción que conecta el destino de origen, SpecifyAmountFragment, con un destino de recepción, ConfirmationFragment.

Safe Args genera una clase SpecifyAmountFragmentDirections con un solo método, actionSpecifyAmountFragmentToConfirmationFragment(), que muestra un objeto NavDirections. Luego, puedes pasar este objeto NavDirections que se devolvió directamente a navigate(), como se indica en el siguiente ejemplo:

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);
}

Si quieres obtener más información para pasar datos entre destinos con Safe Args, consulta Cómo usar Safe Args para pasar datos con seguridad de tipo en Cómo pasar datos entre destinos.