Safeargs库不会生成方向类


79

我使用导航库和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,我可以使用它,但是当我单击“ make project”时,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

在此处输入图片说明


6
我遇到过同样的问题。Build > Rebuild Project为我解决了它。
ban-geoengineering

Answers:


62

查找作为导航源的片段的类。如果您定义了从FragmentA到FragmentB的导航,您会发现FragmentADirections类及其中定义的动作(在nav_graph.xml中)。

然后,要生成方向类(也为参数类),您需要运行Project level gradle然后单击build命令。在这里,我附上了屏幕截图,以使您有一个清晰的了解。

在此处输入图片说明


7
此外,我必须重新同步我的项目才能显示它。
约书亚国王

1
即使在开始SO之前我在这里做了所有建议的解决方案,也没有任何效果,我什至没有使缓存/重启无效,但仍然没有效果。这个答案是我唯一不知道或没有应用的答案,但是它仍然没有直接起作用。它实际上给了我一个构建错误,但我认为它触发了新的错误。然后,我再次执行clean> rebuild,终于成功了。
Ace

无效的缓存和重新启动本身无法运行,必须清除并重建。
apsommer '20

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'
        }
    }
}

希望这可以帮助!


是的,这对我来说是正确的答案。已经包含了插件。
Geert Berkers

该死的!!先生,你真是个了不起的人!谢谢!!
乔治

缺少的参数对我来说破坏了文件分析和检查,该想法不可用。您刚刚救了我的命
Kochchy

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但未应用更改,请确保将CleanBuilt应用到更改顺序中。

在Android Studio中:

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

8

如果以上所有答案都对您不起作用,并且您仍然对无法生成Directions类存在疑问。确保您正在寻找正确的方向课程

例如,我们必须将参数从传递FragmentAFragmentB
在导航图文件中,我们必须将<argument/>标签添加到的标签下FragmentB。这样,我们将获得两个生成的类FragmentBArgsFragmentADirections。如您所见,用于创建的路线类别的FragmentA的名称,而不是FragmentB

因此,请记住,与该问题的用户所寻找的不同,所生成的Directions类将获得动作启动器片段的类名称,并附加单词“ Directions”。不是目标片段的类名(参数的所有者)。

这里是什么文件说:

将为操作起源的每个目的地创建一个类。 此类的名称是原始目的地的名称,后跟单词“ Directions”。

为接收目的地创建一个类。此类的名称是目的地的名称,后跟单词“ Args”。

此外,在action标签下添加arguments标签不会生成路线类。它用于为目标片段的参数提供不同的默认值。

希望这可以帮助!



5

正如克里斯蒂安(Christian)所写,添加源集可以帮助应用gradle文件。这个问题发生在Android Studio 4.1和4.2中。在Kotlin DSL中:

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

这个答案解决了我在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"

而args正确地位于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() }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预览版时发生的。

几个小时后,我决定尝试降级到4.0稳定版。现在所有问题都消失了,我可以调用FragmentDirections并进行编译。

我在问题跟踪器中添加了一个错误:https : //issuetracker.google.com/issues/158777967


1
你救了我几个小时!我遇到了完全相同的问题,降级为稳定和繁荣时期,生成了Directions类!感谢您分享!
米瑟

2

如果有人在使用SafeArgs自动生成类时遇到麻烦,请检查您的AndroidStudio版本。我当时使用的是4.1 beta版,当降级到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>

你什么意思 ?动作和arg在同一片段标签中?没有道理。参数应在目标位置,而操作应在操作源片段标记中
Antroid

1

就我而言,问题是我在两个导航图中使用了具有相同id的相同片段。

Android Studio无法识别其中一个导航图的操作。

因此,对我来说,解决方案是更改其中一个导航图的ID,重新构建,再次更改ID并重新构建

之后,一切又恢复了


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"

清理->构建, 但仍必须手动添加操作路径

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.gradledependencies”部分中:

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

第4步:请nav_graph.xml确保使用将一个片段连接到另一个片段actions

步骤5:清理并重建项目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.