Безопасные аргументы

Рекомендуемый способ навигации между пунктами назначения — использовать плагин Safe Args Gradle. Этот плагин генерирует классы объектов и конструкторов, которые обеспечивают типобезопасную навигацию между пунктами назначения. Используйте Safe Args для навигации и передачи данных между пунктами назначения .

Включить безопасные аргументы

Чтобы добавить Safe Args в свой проект, включите следующий classpath в файл build.gradle верхнего уровня:

классный

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

Котлин

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

Вам также необходимо применить один из двух доступных плагинов.

Чтобы сгенерировать код языка Java, подходящий для Java или смешанных модулей Java и Kotlin, добавьте эту строку в файл build.gradle вашего приложения или модуля :

классный

plugins {
  id 'androidx.navigation.safeargs'
}

Котлин

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

В качестве альтернативы, чтобы сгенерировать код Kotlin, подходящий для модулей только Kotlin, добавьте:

классный

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

Котлин

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

У вас должно быть android.useAndroidX=true в файле gradle.properties в соответствии с переходом на AndroidX .

Сгенерированный код

После включения Safe Args ваш сгенерированный код будет содержать классы и методы для каждого определенного вами действия, а также классы, соответствующие каждому пункту назначения отправки и получения.

Safe Args генерирует класс для каждого пункта назначения, из которого происходит действие. Сгенерированное имя класса добавляет «Направления» к исходному имени класса назначения. Например, если исходный пункт назначения называется SpecifyAmountFragment , созданный класс будет называться SpecifyAmountFragmentDirections .

Сгенерированный класс содержит статический метод для каждого действия, определенного в исходном пункте назначения. Этот метод принимает любые определенные параметры действия в качестве аргументов и возвращает объект NavDirections , который можно передать непосредственно в navigate() .

Пример безопасного аргумента Args

Например, рассмотрим граф навигации с одним действием, которое соединяет два пункта назначения: SpecifyAmountFragment и ConfirmationFragment . ConfirmationFragment принимает один параметр float , который вы предоставляете как часть действия.

Safe Args генерирует класс SpecifyAmountFragmentDirections с помощью одного метода actionSpecifyAmountFragmentToConfirmationFragment() и внутреннего класса ActionSpecifyAmountFragmentToConfirmationFragment . Внутренний класс является производным от NavDirections и хранит связанный идентификатор действия и параметр float . Возвращенный объект NavDirections затем можно передать непосредственно в navigate() , как показано в следующем примере:

Котлин

override fun onClick(v: View) {
    val amount: Float = ...
    val action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment(amount)
    v.findNavController().navigate(action)
}

Ява

@Override
public void onClick(View view) {
    float amount = ...;
    action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment(amount);
    Navigation.findNavController(view).navigate(action);
}

Дополнительные сведения о передаче данных между пунктами назначения с помощью Safe Args см. в разделе Использование Safe Args для передачи данных с безопасностью типов .

Обеспечьте безопасность типов с помощью Safe Args.

Перемещайтесь между пунктами назначения с помощью плагина Safe Args Gradle. Этот плагин генерирует простые классы объектов и конструкторов, которые обеспечивают типобезопасную навигацию и передачу аргументов между пунктами назначения.

Чтобы добавить Safe Args в свой проект, включите следующий classpath в файл build.gradle верхнего уровня:

классный

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

Котлин

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

Вам также необходимо применить один из двух доступных плагинов.

Чтобы сгенерировать код языка Java, подходящий для Java или смешанных модулей Java и Kotlin, добавьте эту строку в файл build.gradle вашего приложения или модуля :

классный

plugins {
  id 'androidx.navigation.safeargs'
}

Котлин

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

В качестве альтернативы, чтобы сгенерировать код Kotlin, подходящий для модулей только Kotlin, добавьте:

классный

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

Котлин

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

У вас должно быть android.useAndroidX=true в файле gradle.properties в соответствии с переходом на AndroidX .

После включения Safe Args плагин генерирует код, содержащий классы и методы для каждого определенного вами действия. Для каждого действия Safe Args также генерирует класс для каждого исходного пункта назначения , который является пунктом назначения, из которого исходит действие. Сгенерированное имя класса представляет собой комбинацию имени исходного класса назначения и слова «Направления». Например, если место назначения называется SpecifyAmountFragment , созданный класс будет называться SpecifyAmountFragmentDirections . Сгенерированный класс содержит статический метод для каждого действия, определенного в исходном пункте назначения. Этот метод принимает любые определенные параметры действия в качестве аргументов и возвращает объект NavDirections , который вы можете передать в navigate() .

В качестве примера предположим, что у нас есть граф навигации с одним действием, которое соединяет исходный пункт назначения SpecifyAmountFragment с получающим пунктом назначения ConfirmationFragment .

Safe Args создает класс SpecifyAmountFragmentDirections с помощью одного метода actionSpecifyAmountFragmentToConfirmationFragment() , который возвращает объект NavDirections . Этот возвращенный объект NavDirections затем можно передать непосредственно в navigate() , как показано в следующем примере:

Котлин

override fun onClick(view: View) {
    val action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment()
    view.findNavController().navigate(action)
}

Ява

@Override
public void onClick(View view) {
    NavDirections action =
        SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment();
    Navigation.findNavController(view).navigate(action);
}

Дополнительные сведения о передаче данных между пунктами назначения с помощью Safe Args см. в разделе Использование Safe Args для передачи данных с безопасностью типов в разделе Передача данных между пунктами назначения .