Safeargs库不会生成方向类

时间:2018-06-04 18:43:47

标签: kotlin android-navigation android-jetpack

我使用导航库和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,我可以使用它但是当我点击&#34; make project&#34;时,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

enter image description here

25 个答案:

答案 0 :(得分:33)

我忘记在app.gradle文件中应用插件,只需添加此行

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

或此行(如果您使用的是Java

apply plugin: "androidx.navigation.safeargs"

答案 1 :(得分:15)

在使用android studio 4.2预览版时,我遇到了类似的问题。

问题是,IDE不知何故没有选择由插件放置生成的方向类的源文件夹。因此,将以下内容添加到我的应用程序build.gradle文件中可以为我解决此问题。

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

希望这会有所帮助!

答案 2 :(得分:12)

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

答案 3 :(得分:10)

我们可以通过在gradle中添加以下代码并重建应用程序来解决此问题。在项目gradle中,添加以下代码。

mbcstowcs()

在应用gradle中添加以下代码

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

答案 4 :(得分:9)

如果您已经添加了dependencies > classpathapply plugin但未应用更改,请确保将 CleanBuilt 中的项目应用订单更改。

在Android Studio中:

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

答案 5 :(得分:8)

如果上述所有答案均对您不起作用,并且您仍然对无法生成路线类有疑问。 确保您正在寻找正确的路线指示课程

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

请注意,与该问题的用户所寻找的内容不同,生成的Directions类将获得操作启动器片段的类名称,并在其后附加单词“ Directions”。不是目标片段的类名(参数的所有者)。

documentation说的是:

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

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

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

希望这会有所帮助!

答案 6 :(得分:5)

正如克里斯蒂安(Christian)所写的那样,添加源代码做应用gradle文件很有帮助。这个问题发生在Android Studio 4.1和4.2中。 在Kotlin DSL中:

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

答案 7 :(得分:5)

以下两个步骤对我有用:

  1. 清理项目。
  2. 重建项目

Android Studio 4.0 Kotlin 1.3.72

答案 8 :(得分: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>

答案 9 :(得分:2)

在您的应用/模块级别添加以下依赖项:

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

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

所有答案也是正确的。只是觉得我应该添加此信息。对我有用

答案 10 :(得分: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>

答案 11 :(得分:2)

如果有人在使用SafeArgs自动生成类时遇到麻烦,请检查您的AndroidStudio版本。我当时使用的是4.1 beta版,当降级到4.0版时,它可以完美运行。一定要尝试。干杯!

答案 12 :(得分:2)

我遵循所有说明,并注意到正在生成Directions类,但在代码中调用时无法编译。这是在使用Android Studio 4.1和4.2预览版时发生的。

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

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

答案 13 :(得分:2)

还要确保使用最新版本。遇到问题了,我有一个1.X版本。

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

在nav.xml中正确地显示了args:

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

答案 14 :(得分:1)

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

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

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

此后,一切又恢复正常

答案 15 :(得分: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 步:清理并重建您的项目。

答案 16 :(得分:1)

我只是在清理后忘记重建我的项目:)

同样不要忘记这两个步骤:

  1. 向项目 Gradle 文件添加安全参数依赖
"android.arch.navigation:navigation-safe-args-gradle-plugin:$version_navigation"
  1. 将 safeargs 插件添加到应用程序 Gradle 文件中 // 为safeargs 添加apply plugin 语句
apply plugin: 'kotlin-kapt'
apply plugin: 'androidx.navigation.safeargs'

答案 17 :(得分: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"
}

}

然后,我必须在 app navigation 模块中添加 plugin (我通常将导航分开在另一个模块中):< / p>

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

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

import yourpackage.FragmentDirections.Companion.actionFirstFragmentToSecondFragment

答案 18 :(得分:0)

问题可能出在您的apply plugin 请检查您是否正在使用Java,然后添加:

apply plugin: "androidx.navigation.safeargs"

对于kotlin,请使用以下

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

答案 19 :(得分:0)

就我而言,我手动添加了参数......在错误的地方??‍♂️

在导航图中选择目的地,然后单击“参数”旁边的“+”按钮。添加相关信息,您应该可以通过 navArgs() 看到生成的 SafeArgs。

这是一个有用的图片指南。 https://medium.com/androiddevelopers/navigating-with-safeargs-bf26c17b1269

答案 20 :(得分:0)

在我的例子中,我没有控制从 Fragment A 拖动到 B,而是从 B 到 A,因此它们没有在正确的 Fragment 类中生成,菜鸟错误!所以也检查这个家伙!

答案 21 :(得分:0)

当您更新导航图上的某些操作或参数时。您需要 Build > Rebuild Project 以查看应用的更改

答案 22 :(得分:0)

出于某种原因(我仍在学习 Android 中 gradle 文件的详细信息),上述插件行不起作用。但这做到了。将此行添加到 build.gradle (app)plugin 部分。

id ("androidx.navigation.safeargs")

没有冒号,没有等号。当然还有同步、重建等。这与其他答案略有不同。但细节在编程中很重要!

答案 23 :(得分:0)

app->build.gradle:

在插件内部,我添加了以下行来解决该问题:

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

答案 24 :(得分:0)

所有解决方案都不适用于我,我已经在 build.gradle 中同步了所有内容。我能找到方向和参数的唯一方法是从 Android 更改为 Project。打开应用程序 -> 包 -> 构建 -> 生成 -> 源代码 -> 导航参数。你会得到片段方向和参数。这是截图,希望对你们有用!

片段方向和参数

enter image description here