具有即时/(动态)功能模块的导航组件

Navigation component with instant/(dynamic-)feature modules

我正在尝试实现具有动态功能的导航组件

因此结构如下所示:

我已经阅读了很多但没有成功如何将它们粘合在一起而不相互依赖,因为每个功能都是完全隔离的

e.g 应用程序 (app module)SplashActivity 开始并检查会话状态,所以我的问题是我应该如何启动 login_graphhome_graph 并且在第一种情况下,在完成身份验证流程后启动主页?

我目前尝试将它们粘合在一起的方法是使用 globalNav 模块(android-库)我找到了几个解决方法:

Intent().setClassName(context.packageName, className).also { context.startActivity(it) }

任何建议都很好 :)


PS:我 viewing/reading 的一些参考文献:

PSS:我正在积极尝试解决这个问题,如果我找到一个好的解决方案,我一定会回答。

编辑

对于对此感兴趣的任何人,因为它目前不受支持,您可以在此处加星标:https://issuetracker.google.com/issues/132170186

几分钟前我也遇到了同样的问题,我在寻找答案时看到了你的问题。

在我的例子中,我有 2 个模块 applogin。模块 login 是 dynamic-feature 模块,它依赖于模块 app。模块 login 包含用于记录目的的所有逻辑和导航(它包含登录、注册等)。我想在应用程序模块的主导航图中包含此 LoginActivity(这是登录模块中的 activity,其中包含所有导航)。我们不能从它不知道的应用程序层调用 LoginActivity。但是

<activity android:id="@+id/loginActivity"
    android:name="login.LoginActivity"
    android:label="LoginActivity"/>

在主导航图中手动添加它对我有用。

使用 navigation-dynamic-feature-* 组件支持按需功能模块中的导航。最新版本可在 maven.google.com.

上找到

我们确实有一个 sample available 演示了 XML 和 Kotlin DSL 声明的可能性。

文档是available here

有关更多信息,您还可以观看 recording on this from the Android Dev Summit 2019

androidx.navigation:navigation-dynamic-features-fragment:2.3.0 现在支持此功能。

只需在导航中包含 app:moduleName

示例:

<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/menu_nav_graph"
    app:startDestination="@id/main_fragment">

<!-- this fragment is in base module -->
<fragment
        android:id="@+id/main_fragment"
        android:name="com.example.app.MainFragment"
        tools:layout="@layout/fragment_main" />

<!-- activity and fragment in a different module -->
<activity
        android:id="@+id/splash_activity"
        android:name="com.example.examplemodule.splash.SplashActivity"
        app:moduleName="examplemodule" />

<fragment
        android:id="@+id/user_profile"
        android:name="com.example.examplemodule.user.UserProfileFragment"
        android:label="UserProfileFragment"
        app:moduleName="examplemodule" />

</navigation>

您可以从任何地方调用 findNavController().navigate(R.id.splash_activity),它会在必要时为您安装 examplemodule