Safe Args

Zalecanym sposobem nawigowania między miejscami docelowymi jest użycie wtyczki Safe Args Gradle. Ta wtyczka generuje klasy obiektów i konstruktora, które umożliwiają bezpieczną nawigację między miejscami docelowymi. Używaj bezpiecznych argumentów do nawigacji i przekazywania danych między miejscami docelowymi.

Włącz bezpieczne argumenty

Aby dodać bezpieczne argumenty do projektu, umieść w pliku build.gradle najwyższego poziomu ten parametr classpath:

Odlotowy

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

Kotlin

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

Musisz też zastosować jedną z dwóch dostępnych wtyczek.

Aby wygenerować kod języka Java odpowiedniego dla Javy lub mieszanych modułów Java i Kotlin, dodaj ten wiersz do pliku build.gradle aplikacji lub modułu:

Odlotowy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

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

Aby wygenerować kod Kotlin odpowiedni dla modułów tylko w Kotlin, dodaj:

Odlotowy

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

Kotlin

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

Musisz mieć android.useAndroidX=true w pliku gradle.properties zgodnie z instrukcjami migracji do AndroidaX.

Wygenerowany kod

Po włączeniu Safe Args wygenerowany kod będzie zawierał klasy i metody każdego zdefiniowanego działania, a także klasy odpowiadające poszczególnym miejscom docelowym wysyłania i odbierania.

Safe Args generuje klasę dla każdego miejsca docelowego, z którego pochodzi działanie. Wygenerowana nazwa klasy spowoduje dodanie instrukcji „Directions” (Trasa dojazdu) do źródłowej nazwy klasy docelowej. Jeśli na przykład miejsce docelowe to SpecifyAmountFragment, wygenerowana klasa to SpecifyAmountFragmentDirections.

Wygenerowana klasa zawiera metodę statyczną dla każdego działania zdefiniowanego w miejscu docelowym źródła. Ta metoda przyjmuje dowolne zdefiniowane parametry działania jako argumenty i zwraca obiekt NavDirections, który możesz przekazać bezpośrednio do navigate().

Przykład Safe Args

Przyjrzyjmy się np. wykresowi nawigacyjnemu z pojedynczym działaniem, które łączy 2 miejsca docelowe: SpecifyAmountFragment i ConfirmationFragment. ConfirmationFragment przyjmuje pojedynczy parametr float podany przez Ciebie w ramach działania.

Safe Args generuje klasę SpecifyAmountFragmentDirections z pojedynczą metodą (actionSpecifyAmountFragmentToConfirmationFragment()) i klasą wewnętrzną o nazwie ActionSpecifyAmountFragmentToConfirmationFragment. Klasa wewnętrzna pochodzi z pliku NavDirections i przechowuje powiązany identyfikator działania oraz parametr float. Zwrócony obiekt NavDirections można następnie przekazać bezpośrednio do navigate(), jak w tym przykładzie:

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

Więcej informacji o przesyłaniu danych między miejscami docelowymi z bezpiecznymi argumentami znajdziesz w artykule o używaniu bezpiecznych argumentów do przekazywania danych z zabezpieczeniami typu.

Zadbaj o bezpieczeństwo typów za pomocą bezpiecznych argumentów

Poruszaj się między miejscami docelowymi za pomocą wtyczki Safe Args Gradle. Ta wtyczka generuje proste klasy obiektów i konstruktora, które umożliwiają bezpieczną nawigację i przekazywanie argumentów między miejscami docelowymi.

Aby dodać bezpieczne argumenty do projektu, umieść w pliku build.gradle najwyższego poziomu ten parametr classpath:

Odlotowy

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

Kotlin

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

Musisz też zastosować jedną z dwóch dostępnych wtyczek.

Aby wygenerować kod języka Java odpowiedniego dla Javy lub mieszanych modułów Java i Kotlin, dodaj ten wiersz do pliku build.gradle aplikacji lub modułu:

Odlotowy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

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

Aby wygenerować kod Kotlin odpowiedni dla modułów tylko w Kotlin, dodaj:

Odlotowy

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

Kotlin

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

Musisz mieć android.useAndroidX=true w pliku gradle.properties zgodnie z instrukcjami migracji do AndroidaX.

Gdy włączysz Safe Args, wtyczka wygeneruje kod zawierający klasy i metody dla każdego zdefiniowanego działania. W przypadku każdego działania Safe Args generuje też klasę dla każdego miejsca docelowego, czyli miejsca docelowego, z którego pochodzi działanie. Wygenerowana nazwa klasy to połączenie nazwy źródłowej klasy docelowej i słowa „Wskazówki dojazdu”. Jeśli na przykład miejsce docelowe to SpecifyAmountFragment, wygenerowana klasa to SpecifyAmountFragmentDirections. Wygenerowana klasa zawiera metodę statyczną dla każdego działania zdefiniowanego w źródłowym miejscu docelowym. Ta metoda przyjmuje dowolne zdefiniowane parametry działania jako argumenty i zwraca obiekt NavDirections, który możesz przekazać do funkcji navigate().

Załóżmy np., że mamy wykres nawigacyjny z pojedynczym działaniem, które łączy punkt początkowy (SpecifyAmountFragment) z miejscem docelowym (ConfirmationFragment).

Safe Args generuje klasę SpecifyAmountFragmentDirections z pojedynczą metodą actionSpecifyAmountFragmentToConfirmationFragment(), która zwraca obiekt NavDirections. Zwrócony obiekt NavDirections można następnie przekazać bezpośrednio do navigate(), jak w tym przykładzie:

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

Więcej informacji o przekazywaniu danych między miejscami docelowymi z użyciem bezpiecznych argumentów znajdziesz w sekcji dotyczącej przekazywania danych z zastosowaniem zabezpieczeń typu za pomocą bezpiecznych argumentów w artykule Przekazywanie danych między miejscami docelowymi.