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.