具有架构组件的多模块导航

2024-04-04

所以我当前的应用程序中的模块有这样的结构。

我还没有找到任何关于多模块导航的官方文档,但我发现了这个article https://medium.com/@hartwich.daniel/multi-module-navigation-with-the-android-architecture-component-82ed028fa1d9关于这一点,我的 gradle 文件如下:

特征 1 - 细节

...
implementation project(":base")
implementation project(":feature-2-detail")
...

特征 2 - 细节

...
implementation project(":base")
implementation project(":feature-1-detail")
...

特征 3 - 细节

...
implementation project(":base")
implementation project(":feature-1-detail")
...

这是我的导航图:

特征 1 - 细节

<navigation ...
    android:id="@+id/graph_feature_1_id">
    <include app:graph="@navigation/graph_feature_2" />
    <fragment ...
        android:id="@+id/nav_feature_1">
        <action ...
            app:destination="@+id/graph_feature_2_id" />

    </fragment>
</navigation>

特征 2 - 细节

<navigation ...
    android:id="@+id/graph_feature_2_id">
    <include app:graph="@navigation/graph_feature_1" />
    <fragment ...
        android:id="@+id/nav_feature_2">
        <action ...
            app:destination="@+id/graph_feature_1_id" />

    </fragment>
</navigation>

特征 3 - 细节

<navigation ...
    android:id="@+id/graph_feature_3_id">
    <include app:graph="@navigation/graph_feature_1" />
    <fragment ...
        android:id="@+id/nav_feature_3">
        <action ...
            app:destination="@+id/graph_feature_1_id" />

    </fragment>
</navigation>

因此,一切都适用于这种设置,但这里的问题是,要将模块连接到另一个模块,我们必须将其他功能添加为当前功能的依赖项。就像我的情况一样,特征 1 - 细节可以去特征 2 - 细节反之亦然,这样做会给我在 gradle 中带来循环依赖。

还有其他方法可以进行多模块导航吗?我尝试过使用深层链接但无济于事。

任何帮助,将不胜感激!谢谢!


这已经过去一年了,但该库现在可以支持这个确切的用例!作为2.1.0-alpha03 https://developer.android.com/jetpack/androidx/releases/navigation#2.1.0-alpha03,我们可以通过深层链接 URI 进行导航。

我们可以让它们之间不相互了解并使用深层链接导航,而不是将这些功能作为实现细节相互添加。

功能 1 - 详细信息 - build.gradle

dependencies {
    implementation project(':base')
}

与相同特征 2 - 细节。它不需要知道其他模块。

要进行模块间导航,我们必须首先定义深层链接,以便通过deepLink tag.

功能 1 - 详细信息 - 导航图

<navigation ...
    android:id="@+id/graph_feature_1_detail_id">
    <fragment ...
        android:id="@+id/nav_feature_1_detail">
        <deepLink app:uri="myApp://feature1detail"/>

    </fragment>
</navigation>

功能 2 - 详细信息 - 导航图

<navigation ...
    android:id="@+id/graph_feature_2_detail_id">
    <fragment ...
        android:id="@+id/nav_feature_2_detail">
        <deepLink app:uri="myApp://feature2detail"/>

    </fragment>
</navigation>

现在我们已经设置了 URI 的深层链接,我们可以直接在NavController

所以在片段中特征 1 - 细节,也许点击按钮?任何需要执行导航的地方

class Feature1DetailFragment {
   fun onViewCreated(...) {
       ...
       view.setOnClickListener {
           val uri = Uri.parse("myApp://feature2detail")
           findNavController().navigate(uri)
       }
   }
}

And in 特征 2 - 细节,

class Feature2DetailFragment {
   fun onViewCreated(...) {
       ...
       view.setOnClickListener {
           val uri = Uri.parse("myApp://feature1detail")
           findNavController().navigate(uri)
       }
   }
}

瞧!模块间导航。

在撰写本文时,最新的稳定版本是2.1.0-rc01.

虽然我还没有在更复杂的项目上尝试过这个,但我喜欢这个库,并且希望看到这个库更加成熟!

我创建了一个中等文章 https://medium.com/@kurt.r.acosta/using-the-navigation-component-in-a-modular-world-e7578825962对这个。你可以看一下。干杯!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有架构组件的多模块导航 的相关文章

随机推荐