Библиотека Safeargs не генерирует класс направления

Я использую библиотеку навигации и safeargs для передачи данных. Я так определяю аргумент фрагмента.

<fragment
        android:id="@+id/otherFragment"
        android:name="com.asd.navigate.OtherFragment"
        android:label="OtherFragment">
        <argument
            android:name="screenTitle"
            android:defaultValue="0"
            app:type="string" />
    </fragment>

Сгенерирован OtherFragmentArgs, я могу его использовать, но класс OtherFragmentDirection не генерируется, когда я нажимаю «Создать проект». Это ошибка или я должен сделать что-то другое.

Спасибо за совет.

buildscript {
    ...
    dependencies {
       ...
        classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01"

    }
}

build.gradle

apply plugin: "androidx.navigation.safeargs"

MainActivity.kt

введите описание изображения здесь


person 6155031    schedule 04.06.2018    source источник
comment
Я была такая же проблема. СборкаПроект перестройки решил эту проблему за меня.   -  person ban-geoengineering    schedule 17.06.2020
comment
Попробуйте обновить версию Kotlin и версию Gradle всего проекта до последних плагинов, которые есть в вашей студии.   -  person Arsh Ansari    schedule 16.07.2021


Ответы (25)


Найдите класс фрагмента, который является источником навигации. Если вы определите навигацию от FragmentA к FragmentB, вы найдете класс FragmentADirections с действиями, которые вы определили (в nav_graph.xml) в нем.

Затем, чтобы сгенерировать класс направления (также класс аргументов), вам нужно перейти Project level gradle, затем щелкнуть команду build. Здесь я приложил снимок экрана, чтобы дать четкое представление.

введите описание изображения здесь

person shmulik.r    schedule 05.07.2018
comment
Кроме того, мне нужно повторно синхронизировать мой проект, чтобы он появился. - person Joshua King; 21.10.2019
comment
Несмотря на то, что я сделал все предлагаемые здесь решения до того, как перейти к SO, ничего не сработало, я даже сделал недействительным кеш / перезапуск, все еще не работал. Это единственный ответ, о котором я не знал и не применял, но он все еще не работал напрямую. Это действительно дало мне ошибку сборки, но я думаю, что это вызвало что-то новое. Затем я снова сделал чистую перестройку, и, наконец, это сработало. - person Ace; 17.05.2020
comment
Недействительный кеш и перезапуск не работают сами по себе, необходимо очистить и пересобрать. - person apsommer; 21.10.2020

Я забыл применить плагин в app.gradle файле, просто добавьте эту строку

apply plugin: "androidx.navigation.safeargs.kotlin"

или эту строку, если вы используете java

apply plugin: "androidx.navigation.safeargs"
person Sanjeev    schedule 14.01.2020
comment
также не забудьте добавить classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0" в build.gradle файл уровня проекта. - person Eric; 14.11.2020
comment
Это подсказало мне решение. Мне пришлось включить этот плагин в build.gradle.kts файл модуля в мой многомодульный проект. - person peter.o; 25.01.2021

Я столкнулся с аналогичной проблемой при работе с предварительной версией Android Studio 4.2.

Проблема заключалась в том, что IDE каким-то образом не выбирала исходные папки, в которые сгенерированные классы направлений помещались плагином. Таким образом, добавление следующего в мой файл приложения build.gradle решило проблему для меня.

sourceSets {
    main {
        java {
            srcDirs += 'build/generated/source/navigation-args'
        }
    }
}

Надеюсь это поможет!

person Christian    schedule 25.06.2020
comment
Да, это был для меня правильный ответ. Уже включены плагины. - person Geert Berkers; 08.10.2020
comment
Проклятие!! Вы сэр замечательный человек! Спасибо!! - person George; 05.12.2020
comment
отсутствующие аргументы нарушили анализ файлов и проверки для меня, ide не использовался. Ты только что спас мне жизнь - person Kochchy; 21.12.2020
comment
Это нарушает сборку androidTest. - person gosr; 05.05.2021
comment
Правильный ответ, отлично работает. Спасибо за решение - person Bilal Bangash; 25.05.2021

Если все приведенные выше ответы не сработали для вас, и у вас все еще есть проблема с тем, что класс маршрутов не создается. Убедитесь, что вы ищете курс с правильными маршрутами.

Например, мы должны передать аргументы от FragmentA до FragmentB.
В файле навигационного графика мы должны добавить тег <argument/> под тегом FragmentB. Таким образом мы получим два сгенерированных класса FragmentBArgs и FragmentADirections. Как видите, для созданного класса маршрутов использовалось имя FragmentA, а не FragmentB.

Итак, имейте в виду, что в отличие от того, что ищет пользователь этого вопроса для сгенерированного класса маршрутов будет добавлено имя класса фрагмента запуска действия со словом «Направления». Не имя класса целевого фрагмента (владелец аргумента).

Вот что в документации говорится:

Класс создается для каждого пункта назначения, в котором происходит действие. Имя этого класса - это имя исходного пункта назначения, к которому добавлено слово «Маршруты».

Для пункта назначения создается класс. Имя этого класса - это имя пункта назначения, к которому добавлено слово «Args».

Кроме того, добавление тега аргумента под тегом действия не приведет к созданию класса маршрутов. Он используется для задания другого значения по умолчанию для аргумента целевого фрагмента.

Надеюсь это поможет!

person Rami Jemli    schedule 26.04.2020
comment
Спасибо тебе за это. Несмотря на то, что у меня была проблема с тем, что мой класс * Args не был сгенерирован, в конце концов я добавил свой тег ‹argument› в исходный фрагмент вместо целевого фрагмента. - person Chapz; 02.02.2021

Мы можем решить эту проблему, добавив приведенные ниже коды в gradle и перестроив приложение. В Gradle проекта добавьте ниже код.

classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"

В приложении Gradle добавьте ниже код

apply plugin: "androidx.navigation.safeargs"
person Fabi    schedule 15.05.2020
comment
Вам лучше использовать classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version", поскольку вы используете AndroidX. - person Micer; 20.06.2020

Если вы уже добавили dependencies > classpath и apply plugin, но изменения не применяются, убедитесь, что Clean и Built в проекте применяются в порядке применения изменений.

В Android Studio:

  • Build tab > Clean project
  • Build tab > ReBuild project
person Alexandre B.    schedule 06.04.2020
comment
у меня была такая же проблема, и решение сработало для меня - person Secret Keeper; 18.04.2021

Как писал Кристиан, помогло добавление файла исходных текстов do app gradle. У меня проблема возникает в Android Studio 4.1 и 4.2. В Kotlin DSL:

android {
    ....
    sourceSets {
        getByName("main").java.srcDirs("build/generated/source/navigation-args")
    }
}
person Zdenek Sima    schedule 26.06.2020
comment
Этот ответ решил мою проблему в Android Studio 4.2 - person MaxGDN; 04.12.2020

Для меня работают следующие два шага:

  1. Чистый проект.
  2. Восстановить проект

Android Studio 4.0 Котлин 1.3.72

person Yogesh Nikam Patil    schedule 22.06.2020

Что касается меня, я понял, что мне также нужно поместить те же аргументы во фрагмент приемника в navi_graph.xml, чтобы сгенерировать класс Arg (уже есть направления). Например:

<fragment android:id="@+id/receiver_fragment" ...>

    <argument android:name="arg_from_sender_fragment".../>

    <argument android:name="arg2_from_sender_fragment".../>

</fragment>
person Leak15    schedule 26.04.2020

Также убедитесь, что используете последнюю версию. Была проблема, что у меня была версия 1.X.

// Navigation
implementation "androidx.navigation:navigation-fragment-ktx:2.2.1"
implementation "androidx.navigation:navigation-ui-ktx:2.2.1"

И аргументы правильно в nav.xml:

<fragment
    android:id="@+id/categoryFragment"
    android:name="com...CategoryFragment"
    android:label="CategoryFragment"
    tools:layout="@layout/fragment_category">
    <action
        android:id="@+id/action_categoryFragment_to_ProductFragment" // /!\
        app:destination="@id/productFragment"
        <argument
            android:name="products"
            android:defaultValue=""
            app:argType="string" />
    </action>
</fragment>

Код:

override fun onItemClicked(category: Category) {
     val action = CategoryFragmentDirections.actionCategoryToProductFragment(products = "myString") // /!\
     view?.findNavController()?.navigate(action)
}
person Javatar    schedule 13.03.2020
comment
Fyi: Также пришлось добавить: kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } в build.gradle - person Javatar; 13.03.2020

На уровне вашего приложения / модуля добавьте следующую зависимость:

    def nav_version = "2.3.0-alpha04"  //your nav_version defined 

    implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

все ответы тоже верны. просто почувствовал, что я должен добавить эту информацию. Это сработало для меня

person Tonui Nicholus    schedule 19.03.2020

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

Android Studio не распознала действия одного из навигационных графиков.

Поэтому решение для меня заключалось в том, чтобы изменить идентификатор одного из графов навигации, перестроить, снова изменить идентификатор и снова перестроить.

После этого все снова заработало

person Jorge Casariego    schedule 09.06.2020

Я четко выполнил все инструкции и заметил, что классы Directions генерируются, но не компилируются при вызове в коде. Это произошло при использовании Android Studio 4.1 и 4.2 Preview.

Через несколько часов я решил попробовать перейти на 4.0 Stable. Теперь все проблемы исчезли, я могу вызвать FragmentDirections, и он компилируется.

Я добавил ошибку в средство отслеживания проблем: https://issuetracker.google.com/issues/158777967

person Sean Blahovici    schedule 11.06.2020
comment
Вы только что сэкономили мне несколько часов! У меня была точно такая же проблема, понижен до стабильной и бум, классы направлений генерируются! Спасибо, что поделились этим! - person Micer; 20.06.2020

Если у кого-то возникают проблемы с автоматически сгенерированными классами с SafeArgs, проверьте свою версию AndroidStudio. Я использовал бета-версию 4.1 (на данный момент), и при понижении до 4.0 она работает отлично. Обязательно попробуйте это. Ваше здоровье!

person Lheonair    schedule 25.06.2020

Потребовалось немного разобраться, но вам нужны как действие, так и аргументы в вашем xml-файле навигации, чтобы сгенерировать и то, и другое.

<fragment
    android:id="@+id/nav_someId"
    android:name=".CategoriesFragment"
    android:label="@string/someName"
    tools:layout="@layout/fragment_categories">
    <argument
        android:name="@string/category"
        android:defaultValue="0"
        app:argType="string" />
    <action
        android:id="@+id/startCategoriesFragment"
        app:destination="@+id/categoriesFragment">
        <argument
            android:name="@string/category"
            android:defaultValue="0"
            app:argType="string" />
    </action>
</fragment>
person Andrei Chernyshev    schedule 04.08.2020
comment
Что ты имеешь в виду ? действие и аргумент в одном теге фрагмента? не имеет смысла. Аргумент должен быть в месте назначения, а действие должно быть в теге исходного действия. - person Antroid; 27.09.2020

В моем случае недостающая часть сначала была в build.gradle.kts

buildscript {
repositories {
    google()
}
dependencies {
    def nav_version = "X.X.X" // Use the latest version
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}

}

а затем мне пришлось добавить плагин в модули app и navigation (я обычно разделяю навигацию в другом):

apply plugin: "androidx.navigation.safeargs.kotlin"

Очистить - ›Сборка Но все равно пришлось вручную добавить путь к действию

import yourpackage.FragmentDirections.Companion.actionFirstFragmentToSecondFragment
person Fernando Prieto Moyano    schedule 27.08.2020
comment
В моем случае мне помогло добавление плагина для kotlin, спасибо - person Abror Esonaliev; 01.04.2021

Следуй этим шагам:

Шаг 1. Добавьте зависимости

def nav_version = "2.3.2"

implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

Шаг 2. Убедитесь, что на уровне приложения build.gradle вы добавили указанные ниже плагины.

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'kotlin-android-extensions'
    id 'androidx.navigation.safeargs.kotlin'
}

Шаг 3: Добавьте это в project_level build.gradle в раздел зависимостей:

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2"

Шаг 4: В вашем nav_graph.xml обязательно соедините один фрагмент с другим с помощью actions.

Шаг 5: Очистите и перестройте свой проект.

person Sumit Shukla    schedule 28.12.2020

Я просто забыл пересобрать свой проект после очистки :)

Также не забывайте эти два шага:

  1. Добавить зависимость safe-args в файл Gradle проекта
"android.arch.navigation:navigation-safe-args-gradle-plugin:$version_navigation"
  1. Добавить плагин safeargs в файл Gradle приложения // Добавление оператора apply plugin для safeargs
apply plugin: 'kotlin-kapt'
apply plugin: 'androidx.navigation.safeargs'
person mir naim hoseyni    schedule 23.04.2021

проблема может быть в вашей apply plugin вещи, пожалуйста, проверьте, используете ли вы java, затем добавьте:

apply plugin: "androidx.navigation.safeargs"

а для котлина используйте это:

apply plugin: "androidx.navigation.safeargs.kotlin"
person Asad    schedule 17.11.2020

В моем случае я вручную добавил аргументы ... не в том месте ????????‍♂️

Выберите пункт назначения на навигационном графике и нажмите кнопку + рядом с аргументами. Добавьте соответствующую информацию, и вы сможете увидеть сгенерированные SafeArgs с помощью navArgs ().

Вот полезное руководство с картинками. https://medium.com/androiddevelopers/navigating-with-safeargs-bf26c17b1269

person Victor Ude    schedule 10.01.2021

В моем случае вместо перетаскивания элемента управления из фрагмента A в B я сделал из B в A, и, таким образом, они не генерировались в правильном классе фрагментов, ошибка новичка! Так что проверьте это тоже, ребята!

person Tarantino    schedule 21.02.2021

Когда вы обновляете некоторые действия или аргументы на навигационном графе. Вам нужно выполнить команду «Сборка» ›« Перестроить проект », чтобы увидеть, как эти изменения были применены.

person David Arribas    schedule 31.03.2021

По какой-то причине (я все еще изучаю подробности о файлах gradle в Android) указанные выше строки плагина не работали. Но это случилось. Добавьте эту строку в раздел plugin вашего build.gradle (app).

id ("androidx.navigation.safeargs")

Нет двоеточия, нет равных. И, конечно же, синхронизировать, перестроить и т. Д. Это немного отличается от других ответов. Но детали в программировании важны!

person SMBiggs    schedule 07.06.2021

app- ›build.gradle:

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

plugins {
    id "androidx.navigation.safeargs.kotlin"
}
person Steve    schedule 27.06.2021

Все решения у меня не работали, и я все синхронизировал в build.gradle. Единственный способ найти направления и аргументы - это перейти с Android на Project. Открыть приложение - ›package -› build - ›created -› source - ›navigation-args. И вы получите направления фрагментов и аргументы. Вот скриншот, надеюсь, это сработает для вас, ребята!

направления и аргументы фрагментов

введите описание изображения здесь

person clone_fg    schedule 16.07.2021