gpt4 book ai didi

android - SafeArgs 未在多模块项目中生成 Directions/Args 类

转载 作者:行者123 更新时间:2023-12-03 13:26:16 26 4
gpt4 key购买 nike

我创建了一个空项目来试用 Navigation 组件。我想看看它在多模块项目中的表现(一个具有大多数依赖项的通用模块,加上将容纳应用程序不同部分的模块,以及将实现所有模块的 :app 模块)。

顶级 gradle 文件具有如下依赖关系:

dependencies {
classpath "com.android.tools.build:gradle:3.6.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0-alpha04"
}

公共(public)模块具有以下依赖项(除其他外):
dependencies {

api "androidx.navigation:navigation-fragment-ktx:2.2.1"
api "androidx.navigation:navigation-ui-ktx:2.2.1"
api "androidx.navigation:navigation-dynamic-features-fragment:2.3.0-alpha04"

}

并且绝对所有模块都在顶部应用了这个插件:
apply plugin: "androidx.navigation.safeargs.kotlin"

现在,每个“ui 模块”中都有 fragment ,并且只有 :app一个实现 main_graph.xml对他们的引用。一个例子是:
<fragment
android:id="@+id/registerFragment"
android:name="example.register.RegisterFragment"
android:label="RegisterFragment">
<action
android:id="@+id/action_registerFragment_to_loginFragment"
app:destination="@id/loginFragment" />
</fragment>

在这一切完成之后,一个好的 Clean Project + Rebuild Project 就完成了。

对我来说,这是有道理的。但是,当我尝试调用理论上自动生成的文件 RegisterFragmentDirections不存在,不在特定的子模块中,不在主模块中。 NavDirections可以找到(因此依赖项以某种方式起作用),但不是生成的依赖项。

我已经尝试在每个模块中实现所有依赖项,将导航版本回滚到以前的 alpha 版本……没有成功。

最佳答案

我对我的项目也有完全相同的要求。当我在寻找答案时,我偶然发现了这一点,但没有一个答案真正回答了这个问题。所以,这就是我解决它的方法。
我有一个主应用程序模块。假设 app .我有大约 7 个功能模块,它们有自己的 fragment 和自己的流程。根据我的经验,会发生这种情况:
如果您将所有模块包含到主应用程序模块并使用所有包含的 fragment 创建一个图形,则将为主应用程序模块生成生成的导航方向和参数文件。因此,这意味着您不能在单独的模块中使用它们。但是,如果您在每个模块中创建导航图,并将其用作主图中的包含模块,则主模块将不知道模块图内部的那些方向和参数。因此,问题就在于此,捕捉 22 样式。
我是如何解决的:

  • 每个模块都有自己的导航图。确保它们在 navigation 中标识标签
  • 这些图包含在主图中,include .
  • 在每个模块中,我定义了一个定义所有导航操作的界面。例如,在 Module1我有
  • interface Module1Navigation {
    fun navigateToFragment2(arg1: String, arg2: Int)
    ...
    }
  • 在主应用程序中,我有一个 Navigator实现所有这些接口(interface)的类,例如:
  • object Navigator: Module1Navigation, Module2Navigation, ... {
    private var navController: NavController? = null
    // bind in onResume for activity implementing the graph
    fun bind(navController: NavController) {
    this.navController = navController
    }

    // bind in onPause for activity implementing the graph
    fun unbind() {
    this.navController = null
    }
    // Implement all the members
    ...
    }
  • 每个模块级接口(interface)都在每个要导航的 fragment 中注入(inject) DI,或者您可以将其传入。我使用 DI 来获取它:
  •     private val navigation: Modudle1Navigation by lazy {
    XInjectionManager.findComponent<Modudle1Navigation>()
    }
    有了这个设置,现在所有模块都可以自由地拥有自己的图表、自己的安全参数,并且可以很好地集成在一起。
    最好的一点是你的模块甚至不需要知道这个特定的导航框架,或者它是如何实现的,并且很容易扩展。
    此外,您可以为每个模块创建自己的应用程序,以实现更可控的模块级质量保证。
    希望这可以帮助那里的人。

    关于android - SafeArgs 未在多模块项目中生成 Directions/Args 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60918019/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com