Safe Args

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: SpecifyAmountFragmentConfirmationFragment. 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.