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,我可以使用它,但是当我单击“ make project”时,OtherFragmentDirectclass 不会生成。是虫子还是我得做点别的。

谢谢你的建议。

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


}
}

建造,分级

apply plugin: "androidx.navigation.safeargs"

MainActivity.kt

enter image description here

55309 次浏览

寻找作为导航源的片段类。如果您定义了从 FragmentA 到 FragmentB 的导航,那么您将在其中找到具有您定义的操作(在 nav _ grap.xml 中)的 FragmentADirections 类。

然后,要生成方向类(也是参数类) ,您需要转到 Project level gradle,然后单击 build命令。在这里,我附上了一个截图,以提供一个清晰的理解。

enter image description here

我忘了在 app.gradle文件中应用插件,只需添加这一行

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

如果你正在使用 java,这一行

apply plugin: "androidx.navigation.safeargs"

还要确保使用最新版本。有问题,我有一个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)
}

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

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


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

所有的答案都是正确的。只是觉得我应该添加这个信息。它为我工作

如果您已经添加了 dependencies > classpathapply plugin,但是没有应用更改,请确保按照应用更改的顺序对 ABC2和 Built项目进行更改。

在 Android Studio 中:

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

对于我来说,我意识到我还需要将相同的参数放入 navi _ grap.xml 中的接收器片段中,以便生成 Arg 类(已经有了方向)。 例如:

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


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


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


</fragment>

如果上面的所有答案对你来说都不起作用,并且你仍然对没有生成指示类有问题。确保你正在寻找正确的方向类.例如,我们必须将参数从 FragmentA传递到 FragmentB。< br/> 在导航图文件中,我们必须在 FragmentB的标记下添加 <argument/>标记。这样,我们将得到两个生成的类 FragmentBArgsFragmentADirections。如你所见,创建的方向类使用的是 ABC0的名称,而不是 FragmentB。< br/> < br/> 因此,请记住,与这个问题的用户所寻找的不同,生成的 Directions 类将获得添加了单词“ Directions”的 action starter 片段的类名。不是目标片段的类名(参数的所有者)。< br/>
文件是这么说的:

将为发起操作的每个目标创建一个类。 此类的名称是起始目标的名称, 附有“说明”一词。 < br/>
为接收目的地创建一个类 Class 是目标的名称,后面加上单词“ Args”。

另外,将参数标记添加到 action 标记之下不会生成方向类。它用于为目标片段的参数提供不同的默认值。

希望这个能帮上忙!

我们可以修复这个问题,通过添加以下代码在分级和重建应用程序。在项目级别中添加以下代码。

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

在应用程序级别添加下面的代码

apply plugin: "androidx.navigation.safeargs"

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

Android Studio 没有识别出其中一个导航图的操作。

所以我的解决方案是 更改其中一个导航图的 id,重新生成,再次更改 id 并重新生成

之后一切又恢复正常了

我严格遵循所有的指令,注意到 Directions 类正在生成,但在代码中调用时不会编译。这是在使用 Android Studio 4.1和4.2预览版时发生的。

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

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

以下两个步骤对我有效:

  1. 清洁工程。
  2. 重建项目

Android 工作室4.0 科特林1.3.72

如果有人在使用 SafeArgs 自动生成类时遇到麻烦,请检查您的 AndroidStudio 版本。我当时使用的是4.1 beta 版本(此时) ,当降级到4.0版本时,它完全可以正常工作。一定要试试。干杯!

我在使用 android 工作室4.2预览版时也遇到过类似的问题。

问题在于 IDE 不知何故没有选择插件放置生成的方向类所在的源文件夹。因此,将以下内容添加到我的 app build.gradle 文件解决了这个问题。

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

希望这个能帮上忙!

正如克里斯蒂安所写的,将源代码集添加到应用程序级别文件有所帮助。对我来说,这个问题发生在 Android Studio 4.1和4.2中。 在 Kotlin DSL:

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

需要花一点时间来弄清楚,但是需要在导航 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>

在我的情况下,缺失的部分首先是在 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

问题可能出在你的 apply plugin上 请检查你是否在使用 java,然后添加:

apply plugin: "androidx.navigation.safeargs"

Kotlin 用这个:

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

遵循以下步骤:

步骤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

第五步: 清理和重建你的项目。

在我的例子中,我手动添加了论点... 在错误的地方♂‍

在导航图中选择目标,然后单击“ Arguments”旁边的“ +”按钮。添加相关信息,您应该能够看到由 navArgs ()生成的 SafeArgs。

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

在我的例子中,我没有从片段 A 拖拽到片段 B,而是从片段 A 拖拽到片段 A,因此它们没有在正确的片段类中生成,新手错误!伙计们,看看这个!

当您更新导航图上的某些操作或参数时。您需要构建 > 重新构建项目以查看应用此更改

我只是在清理完我的项目后忘了重建它:)

也不要忘记这两个步骤:

  1. 将 safe-args 依赖项添加到项目 Gradle 文件
"android.arch.navigation:navigation-safe-args-gradle-plugin:$version_navigation"
  1. 添加 safeargs 插件到应用程序 Gradle 文件 //添加用于 Safeargs 的 application 插件语句
apply plugin: 'kotlin-kapt'
apply plugin: 'androidx.navigation.safeargs'

出于某种原因(我还在学习 Android 中的 gradle 文件的细节) ,上面的插件行没有工作。但这个可以。将这一行添加到 Gradle (app)plugin部分中。

id ("androidx.navigation.safeargs")

没有冒号,就没有等号。当然还有同步,重建等等。这是 有点不同于其他答案。但是细节在编程中是很重要的!

App-> build.gradle:

在插件中,我添加了以下一行来解决这个问题:

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

所有的解决方案都不适合我,而且我已经在 build. gradle 中同步了所有的解决方案。我能找到方向和参数的唯一方法就是从 Android 切换到 Project。打开应用程序-> 包-> 构建-> 生成-> 源-> 导航-args。你会得到碎片方向和参数。这是截图,希望对你们有用!

碎片方向和参数

enter image description here

如果其他答案都不适合您,并且您正在使用多个 NavGraph,请确保您的 NavGraph id 在 xml 中是不同的。

<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph">

build.gradle(模块级别)中应用插件

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

build.gradle(项目级别)中添加依赖项

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0-rc01"

这样问题就解决了。