Safe Args

Il modo consigliato per spostarsi tra le destinazioni è utilizzare il plug-in Gradle Safe Args. Questo plug-in genera classi di oggetti e builder che consentono la navigazione con sicurezza dei tipi tra le destinazioni. Utilizza Safe Args per navigare e trasferire dati tra le destinazioni.

Abilitare Safe Args

Per aggiungere Safe Args al tuo progetto, includi il seguente classpath nel file build.gradle di primo livello:

Groovy

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

Kotlin

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

Devi anche applicare uno dei due plug-in disponibili.

Per generare codice del linguaggio Java adatto a moduli Java o misti Java e Kotlin, aggiungi questa riga al file build.gradle della tua app o del tuo modulo:

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

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

In alternativa, per generare codice Kotlin adatto a moduli solo Kotlin, aggiungi:

Groovy

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

Kotlin

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

Devi avere android.useAndroidX=true nel tuo file gradle.properties come indicato in Migrazione ad AndroidX.

Codice generato

Dopo aver abilitato Safe Args, il codice generato contiene classi e metodi per ogni azione che hai definito, nonché classi che corrispondono a ogni destinazione di invio e ricezione.

Safe Args genera una classe per ogni destinazione da cui ha origine un'azione. Il nome della classe generata aggiunge "Directions" al nome della classe della destinazione di origine. Ad esempio, se la destinazione di origine è denominata SpecifyAmountFragment, la classe generata è denominata SpecifyAmountFragmentDirections.

La classe generata contiene un metodo statico per ogni azione definita nella destinazione di origine. Questo metodo accetta come argomenti tutti i parametri di azione e restituisce un oggetto NavDirections che puoi passare direttamente a navigate().

Esempio di Safe Args

Ad esempio, considera un grafico di navigazione con una singola azione che collega due destinazioni, SpecifyAmountFragment e ConfirmationFragment. ConfirmationFragment accetta un singolo parametro float che fornisci come parte dell'azione.

Safe Args genera una classe SpecifyAmountFragmentDirections con un singolo metodo, actionSpecifyAmountFragmentToConfirmationFragment(), e una classe interna denominata ActionSpecifyAmountFragmentToConfirmationFragment. La classe interna deriva da NavDirections e memorizza l'ID azione associato e il parametro float. L'oggetto NavDirections restituito può essere passato direttamente a navigate(), come mostrato nell'esempio seguente:

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

Per ulteriori informazioni sul passaggio di dati tra le destinazioni con Safe Args, consulta Utilizzare Safe Args per passare dati con sicurezza dei tipi.

Garantire la sicurezza dei tipi utilizzando Safe Args

Spostati tra le destinazioni utilizzando il plug-in Gradle Safe Args. Questo plug-in genera classi di oggetti e builder semplici che consentono la navigazione con sicurezza dei tipi e il passaggio di argomenti tra le destinazioni.

Per aggiungere Safe Args al tuo progetto, includi il seguente classpath nel file build.gradle di primo livello:

Groovy

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

Kotlin

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

Devi anche applicare uno dei due plug-in disponibili.

Per generare codice del linguaggio Java adatto a moduli Java o misti Java e Kotlin, aggiungi questa riga al file build.gradle della tua app o del tuo modulo:

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

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

In alternativa, per generare codice Kotlin adatto a moduli solo Kotlin, aggiungi:

Groovy

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

Kotlin

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

Devi avere android.useAndroidX=true nel tuo file gradle.properties come indicato in Migrazione ad AndroidX.

Dopo aver abilitato Safe Args, il plug-in genera codice che contiene classi e metodi per ogni azione che hai definito. Per ogni azione, Safe Args anche genera una classe per ogni destinazione di origine, ovvero la destinazione da cui ha origine l'azione. Il nome della classe generata è una combinazione del nome della classe della destinazione di origine e della parola "Directions". Ad esempio, se la destinazione è denominata SpecifyAmountFragment, la classe generata è denominata SpecifyAmountFragmentDirections. La classe generata contiene un metodo statico per ogni azione definita nella destinazione di origine. Questo metodo accetta come argomenti tutti i parametri di azione definiti e restituisce un oggetto NavDirections che puoi passare a navigate().

Ad esempio, supponiamo di avere un grafico di navigazione con una singola azione che collega la destinazione di origine, SpecifyAmountFragment, a una destinazione di ricezione, ConfirmationFragment.

Safe Args genera una classe SpecifyAmountFragmentDirections con un singolo metodo, actionSpecifyAmountFragmentToConfirmationFragment(), che restituisce un oggetto NavDirections. L'oggetto NavDirections restituito può essere passato direttamente a navigate(), come mostrato nell'esempio seguente:

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

Per ulteriori informazioni sul passaggio di dati tra le destinazioni con Safe Args, consulta Utilizzare Safe Args per passare dati con sicurezza dei tipi in Passare dati tra le destinazioni.