Zalecanym sposobem przechodzenia między miejscami docelowymi jest użycie wtyczki Gradle Safe Args. Ta wtyczka generuje klasy obiektów i konstruktorów, które umożliwiają bezpieczną pod względem typów nawigację między miejscami docelowymi. Używaj Safe Args do nawigacji i przekazywania danych między miejscami docelowymi.
Włączanie Safe Args
Aby dodać do projektu Safe Args, w pliku najwyższego poziomu build.gradle umieść ten kod:classpath
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") } }
Musisz też zastosować jedną z 2 dostępnych wtyczek.
Aby wygenerować kod w języku Java odpowiedni dla modułów Java lub mieszanych modułów Java i Kotlin, dodaj ten wiersz do pliku build.gradle aplikacji lub modułu:
Groovy
plugins { id 'androidx.navigation.safeargs' }
Kotlin
plugins { id("androidx.navigation.safeargs") }
Aby wygenerować kod w języku Kotlin odpowiedni dla modułów tylko w tym języku, dodaj:
Groovy
plugins { id 'androidx.navigation.safeargs.kotlin' }
Kotlin
plugins { id("androidx.navigation.safeargs.kotlin") }
W pliku gradle.properties musisz mieć android.useAndroidX=true zgodnie z informacjami w artykule Migracja do AndroidaX.
Wygenerowany kod
Po włączeniu Safe Args wygenerowany kod zawiera klasy i metody dla każdego zdefiniowanego działania, a także klasy odpowiadające każdemu miejscu docelowemu wysyłania i odbierania.
Safe Args generuje klasę dla każdego miejsca docelowego, z którego pochodzi działanie. Wygenerowana nazwa klasy zawiera słowo „Directions” (Wskazówki) dodane do nazwy klasy miejsca docelowego. Jeśli na przykład miejsce docelowe ma nazwę SpecifyAmountFragment, wygenerowana klasa ma nazwę SpecifyAmountFragmentDirections.
Wygenerowana klasa zawiera statyczną metodę dla każdego działania zdefiniowanego w miejscu docelowym. Ta metoda przyjmuje zdefiniowane parametry działania jako argumenty i zwraca obiekt NavDirections, który możesz przekazać bezpośrednio do navigate().
Przykład Safe Args
Załóżmy, że masz wykres nawigacji z jedną czynnością, która łączy 2 miejsca docelowe: SpecifyAmountFragment i ConfirmationFragment. Funkcja ConfirmationFragment przyjmuje jeden parametr float, który podajesz w ramach działania.
Safe Args generuje klasę SpecifyAmountFragmentDirections z jedną metodą actionSpecifyAmountFragmentToConfirmationFragment() i klasą wewnętrzną o nazwie ActionSpecifyAmountFragmentToConfirmationFragment. Klasa wewnętrzna pochodzi z klasy 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 pokazano 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 przekazywaniu danych między miejscami docelowymi za pomocą Safe Args znajdziesz w artykule Używanie Safe Args do przekazywania danych z zabezpieczeniami wpisywania.
Zapewnianie bezpieczeństwa typów za pomocą Safe Args
Przechodzenie między miejscami docelowymi za pomocą wtyczki Safe Args Gradle. Ta wtyczka generuje proste klasy obiektów i konstruktorów, które umożliwiają bezpieczną pod względem typów nawigację i przekazywanie argumentów między miejscami docelowymi.
Aby dodać do projektu Safe Args, w pliku najwyższego poziomu build.gradle umieść ten kod:classpath
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") } }
Musisz też zastosować jedną z 2 dostępnych wtyczek.
Aby wygenerować kod w języku Java odpowiedni dla modułów Java lub mieszanych modułów Java i Kotlin, dodaj ten wiersz do pliku build.gradle aplikacji lub modułu:
Groovy
plugins { id 'androidx.navigation.safeargs' }
Kotlin
plugins { id("androidx.navigation.safeargs") }
Aby wygenerować kod w języku Kotlin odpowiedni dla modułów tylko w tym języku, dodaj:
Groovy
plugins { id 'androidx.navigation.safeargs.kotlin' }
Kotlin
plugins { id("androidx.navigation.safeargs.kotlin") }
W pliku gradle.properties musisz mieć android.useAndroidX=true zgodnie z informacjami w artykule Migracja do AndroidaX.
Po włączeniu Safe Args wtyczka generuje kod zawierający klasy i metody dla każdej zdefiniowanej przez Ciebie czynności. Dla 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 jest połączeniem nazwy klasy miejsca docelowego i słowa „Directions”. Jeśli np. miejsce docelowe ma nazwę SpecifyAmountFragment, wygenerowana klasa ma nazwę SpecifyAmountFragmentDirections. Wygenerowana klasa zawiera statyczną metodę dla każdego działania zdefiniowanego w miejscu docelowym. Ta metoda przyjmuje jako argumenty wszystkie zdefiniowane parametry działania i zwraca obiekt NavDirections, który możesz przekazać do metody navigate().
Załóżmy, że mamy wykres nawigacji z 1 działaniem, które łączy miejsce docelowe SpecifyAmountFragment z miejscem docelowym ConfirmationFragment.
Safe Args generuje klasę SpecifyAmountFragmentDirections z jedną 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 za pomocą Safe Args znajdziesz w artykule Przekazywanie danych z zachowaniem bezpieczeństwa typów za pomocą Safe Args w sekcji Przekazywanie danych między miejscami docelowymi.