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


80

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

<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 не генерується, коли я натискаю "зробити проект". Це помилка, або мені доводиться робити щось інше.

Thnx за порадою.

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

    }
}

build.gradle

apply plugin: "androidx.navigation.safeargs"

MainActivity.kt

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


6
У мене була та сама проблема. Build > Rebuild Project вирішив це для мене.
заборона геоінженерії

Відповіді:


62

Шукайте клас фрагмента, який є джерелом навігації. Якщо ви визначите навігацію від FragmentA до FragmentB, ви знайдете клас FragmentADirections з діями, які ви визначили (у nav_graph.xml).

Потім, щоб сформувати клас напряму (Також клас аргументів), потрібно перейти, Project level gradleа потім клацнути buildкоманду. Тут я додав скріншот, щоб дати чітке розуміння.

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


7
Крім того, я повинен повторно синхронізувати свій проект, щоб він з’явився.
Джошуа Кінг

1
навіть незважаючи на те, що я зробив усі запропоновані рішення тут до того, як прийти до SO, нічого не працювало, я навіть зробив недійсним кеш / перезапуск, все одно не працював. Ця відповідь єдина, про яку я не знав і не застосовував її, але вона все одно безпосередньо не спрацювала. Це насправді дало мені помилку збірки, але я думаю, це спричинило щось нове. Потім я зробив чисте> відновлення знову, і це нарешті вдалося.
Туз,

Вивести кеш-пам’ять і перезапуск не працює сам по собі, його потрібно очистити та відновити.
apsommer

34

Я забув застосувати плагін у app.gradleфайлі, просто додайте цей рядок

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

або цей рядок, якщо ви використовуєте java

apply plugin: "androidx.navigation.safeargs"

також не забудьте також додати файл у файл classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0"рівня проектуbuild.gradle
Ерік

18

Я зіткнувся з подібною проблемою, працюючи з попереднім переглядом android studio 4.2.

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

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

Сподіваюся, це допомагає!


Так, це була правильна відповідь для мене. Вже включені плагіни.
Герт Беркерс,

Блін !! Ви, сер, дивовижна людина! Дякую!!
Джордж

відсутні аргументи порушили для мене аналіз файлів та перевірки, ідея не була придатною для використання. Ви щойно врятували мені життя
Кохчі

10

Ми можемо вирішити цю проблему, додавши наведені нижче коди в gradle та відновивши додаток. У проект gradle додайте нижче код.

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

У додаток gradle додайте нижче код

apply plugin: "androidx.navigation.safeargs"

Вам краще використовувати, classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"оскільки ви використовуєте AndroidX.
Мікер

9

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

В Android Studio:

  • Build tab > Clean project
  • Build tab > ReBuild project

8

Якщо всі наведені вище відповіді не працювали для вас, і ви все ще маєте проблему з тим, що не створюється клас напрямків. Переконайтеся, що ви шукаєте правильний клас напрямків .

Наприклад, ми повинні передавати аргументи від FragmentAдо FragmentB.
У файл графіку навігації ми повинні додати <argument/>тег під тегом FragmentB''. Таким чином, ми отримаємо два згенерованих класи FragmentBArgsта FragmentADirections. Як бачите, це FragmentAім'я, яке звикло до створеного класу напрямків, а неFragmentB .

Отже, майте на увазі, що на відміну від того, що шукає користувач цього запитання, згенерований клас напрямків отримає ім’я класу фрагмента початкового етапу дії, доданого до слова „Напрямки”. Не назва класу фрагмента призначення (власник аргументу).

Ось що сказано в документації :

Клас створюється для кожного пункту призначення, з якого починається дія. Назва цього класу - це назва місця відправлення, додане до слова "Напрямки".

Клас створюється для одержувача. Назва цього класу - це назва пункту призначення, додане до слова "Args".

Крім того, додавання тегу аргументу під тегом дії не призведе до створення класу напрямків. Він використовується для надання іншого значення за замовчуванням для аргументу цільового фрагмента.

Сподіваюся, це допомагає!


6

Як писав Крістіан, допомогло додавання набору джерел, чи файл app gradle. Проблема виникає в Android Studio 4.1 та 4.2 для мене. У Kotlin DSL:

android {
    ....
    sourceSets {
        getByName("main").java.srcDirs("build/generated/source/navigation-args")
    }
}

1
Ця відповідь вирішила мою проблему в Android Studio 4.2
MaxGDN


4

Для мене я зрозумів, що мені також потрібно вставити ті самі аргументи у фрагмент одержувача у 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>

2

Також обов’язково використовуйте останню версію. Виникла проблема в тому, що я мав версію 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)
}

1
Fyi: Також довелося додати: kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() }to build.gradle
Javatar

2

На рівні програми / модуля додайте таку залежність:

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

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

всі відповіді теж правильні. просто відчув, що мені слід додати цю інформацію. У мене це спрацювало


2

Я дотримувався всіх вказівок до листа і помітив, що створюються класи Directions, але не збирався компілювати при виклику коду. Це сталося під час використання Android Studio 4.1 та 4.2 Preview.

Через кілька годин я вирішив спробувати знизити версію до 4.0 Stable. Зараз усі проблеми зникли, я можу зателефонувати до FragmentDirections, і він компілюється.

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


1
Ви просто врятували мене кілька годин! У мене була точно така ж проблема, знижена до стабільної та бум, класи напрямків генеруються! Дякуємо, що поділилися цим!
Мікер

2

Якщо хтось має проблеми з автоматично згенерованими класами за допомогою SafeArgs, перевірте версію AndroidStudio. Я використовував 4.1 бета-версію (на даний момент), і при зниженні до 4.0 це працює ідеально. Безумовно, спробуйте це. На здоров’я!


2

Щоб трохи зрозуміти, потрібно трохи, але для створення обох вам потрібні як дія, так і аргументи у вашому файлі nav 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>

Що ви маєте на увазі ? дія та аргумент у тому самому тегу фрагмента? не має сенсу. Аргумент повинен бути в пункті призначення, а дія - у тегу фрагмента, що походить від дії
Antroid

1

У моєму випадку проблема полягала в тому, що я використовував той самий фрагмент з однаковим ідентифікатором у 2 навігаційних графіках.

Android Studio не розпізнав дії одного з графіків навігації.

Тож рішенням для мене було змінити ідентифікатор одного з навігаційних графіків, відновити, знову змінити ідентифікатор і відновити знову .

Після цього все знову запрацювало


0

У моєму випадку відсутня частина була спочатку у 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"
}

}

а потім мені довелося додати плагін в додатки та модулі навігації (я зазвичай відокремлюю навігацію в іншому):

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

Clean -> Build, але все одно довелося вручну додати шлях до дії

import yourpackage.FragmentDirections.Companion.actionFirstFragmentToSecondFragment

0

проблема може бути у вашій apply pluginречі, перевірте, чи використовуєте ви java, а потім додайте:

apply plugin: "androidx.navigation.safeargs"

а для kotlin використовуйте це:

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

0

Виконайте такі дії:

Крок 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: Очистіть і відновіть свій проект.


0

У моєму випадку я вручну додав аргументи ... не в тому місці 🤦🏿‍♂️

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

Ось корисний путівник із картинками. https://medium.com/androiddevelopers/navigating-with-safeargs-bf26c17b1269

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.