Safeargs 库不生成方向 class

Safeargs library doesnt generate direction class

我使用导航库和 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 class 不会生成。是那个错误还是我必须做一些不同的事情。

谢谢你的建议。

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

    }
}

build.gradle

apply plugin: "androidx.navigation.safeargs"

MainActivity.kt

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

然后,要生成方向 class(也是参数 class),您需要转到 Project level gradle,然后单击 build 命令。这里我附上截图,让大家一目了然。

我忘记在 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 中的参数正确:

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

在您的 app/module 关卡中添加以下依赖项:

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

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

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

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

在 Android 工作室中:

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

对我来说,我意识到我还需要将相同的参数放入 navi_graph.xml 中的接收器片段中,以便生成 Arg class(已经有说明)。 例如:

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

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

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

</fragment>

如果以上所有答案都不适合您,并且您仍然遇到未生成路线 class 的问题。 确保您正在寻找正确的方向 class

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

因此,请记住,与此问题的用户正在寻找的内容不同,生成的方向 class 将获得 class 动作起始片段的名称并附加单词 "Directions".不是目标片段的 class 名称(参数的所有者)。

documentation 是这样写的:

A class is created for each destination where an action originates. The name of this class is the name of the originating destination, appended with the word "Directions".

A class is created for the receiving destination. The name of this class is the name of the destination, appended with the word "Args".

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

希望对您有所帮助!

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

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

在应用程序中 gradle 添加以下代码

apply plugin: "androidx.navigation.safeargs"

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

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

所以我的解决方案是 更改其中一个导航图的 ID,重建,再次更改 ID,然后再次重建

之后一切都恢复正常了

我严格按照所有说明进行操作,发现正在生成说明 类,但在代码中调用时无法编译。这发生在使用 Android Studio 4.1 和 4.2 预览版时。

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

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

以下两个步骤对我有用:

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

Android 工作室 4.0 科特林 1.3.72

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

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

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

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

希望对您有所帮助!

正如 Christian 所写,添加 source set do app gradle 文件很有帮助。对我来说,问题出现在 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"
}

}

然后,我必须在 appnavigation 模块中添加 plugin(我通常将导航分开放在不同的导航中):

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

Clean -> Build 但仍然必须手动添加操作路径

import yourpackage.FragmentDirections.Companion.actionFirstFragmentToSecondFragment

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

apply plugin: "androidx.navigation.safeargs"

对于科特林使用这个:

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

按照以下步骤操作:

Step 1: Add dependencies

def nav_version = "2.3.2"

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

Step 2: In your app-level build.gradle make sure you have below plugins added.

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

Step 3: Add this in project_level build.gradle inside dependencies section :

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

Step 4: In your nav_graph.xml make sure to connect one fragment to another with actions.

Step 5: Clean & Rebuild your project.

在我的例子中,我手动添加了参数......在错误的地方‍♂️

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

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

在我的例子中,我没有通过控制从片段 A 拖动到 B,而是将 B 拖到 A,因此它们没有在正确的片段中生成 class,菜鸟错误!伙计们,也请检查一下!

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

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

另外不要忘记这两步:

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

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

plugin 部分
id ("androidx.navigation.safeargs")

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

app->build.gradle:

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

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

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

片段方向和参数

如果 none 的其他答案对您有用,并且您正在使用多个 NavGraph,请确保 xml 中的 NavGraph id 不同。

<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"

这将解决问题。