具有即时/(动态)功能模块的导航组件
Navigation component with instant/(dynamic-)feature modules
-
android
-
android-intent
-
android-instant-apps
-
android-architecture-components
-
android-architecture-navigation
我正在尝试实现具有动态功能的新导航组件
因此结构如下所示:
- 应用程序(在 gradle 中包含动态
dynamicFeatures = []
)
特征
- 登录
- 家
- 等等
图书馆 -> globalNav
我已经阅读了很多但没有成功如何将它们粘合在一起而不相互依赖,因为每个功能都是完全隔离的
e.g 应用程序 (app module)
从 SplashActivity
开始并检查会话状态,所以我的问题是我应该如何启动 login_graph
或 home_graph
并且在第一种情况下,在完成身份验证流程后启动主页?
我目前尝试将它们粘合在一起的方法是使用 globalNav
模块(android-库)我找到了几个解决方法:
- 完整的类路径,这意味着我从类名开始意图(不好,因为这不是真正可扩展的,并且需要维护 PITA)
Intent().setClassName(context.packageName, className).also { context.startActivity(it) }
深层链接(我想用作我的导航图的那个已经有了)但出于某种原因,它总是显示 "Choose complete action" 选择器,即使只有我的应用程序使用它。
- 我已经尝试使用
actions
但与深层链接的行为相同
任何建议都很好 :)
PS:我 viewing/reading 的一些参考文献:
https://www.youtube.com/watch?v=ST2W1Y_Ztvk
- 这个视频似乎用即时应用程序解决了我的问题(在谈话结束时),但是有几个问题,时间已经 运行 所以他们不得不匆忙,而且没有模型包含此用例的项目:()
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
GitHub googlesamples
存储库
PSS:我正在积极尝试解决这个问题,如果我找到一个好的解决方案,我一定会回答。
编辑
对于对此感兴趣的任何人,因为它目前不受支持,您可以在此处加星标:https://issuetracker.google.com/issues/132170186
几分钟前我也遇到了同样的问题,我在寻找答案时看到了你的问题。
在我的例子中,我有 2 个模块 app 和 login。模块 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 声明的可能性。
有关更多信息,您还可以观看 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
。
android
android-intent
android-instant-apps
android-architecture-components
android-architecture-navigation
我正在尝试实现具有动态功能的新导航组件
因此结构如下所示:
- 应用程序(在 gradle 中包含动态
dynamicFeatures = []
) 特征
- 登录
- 家
- 等等
图书馆 -> globalNav
我已经阅读了很多但没有成功如何将它们粘合在一起而不相互依赖,因为每个功能都是完全隔离的
e.g 应用程序 (app module)
从 SplashActivity
开始并检查会话状态,所以我的问题是我应该如何启动 login_graph
或 home_graph
并且在第一种情况下,在完成身份验证流程后启动主页?
我目前尝试将它们粘合在一起的方法是使用 globalNav
模块(android-库)我找到了几个解决方法:
- 完整的类路径,这意味着我从类名开始意图(不好,因为这不是真正可扩展的,并且需要维护 PITA)
Intent().setClassName(context.packageName, className).also { context.startActivity(it) }
深层链接(我想用作我的导航图的那个已经有了)但出于某种原因,它总是显示 "Choose complete action" 选择器,即使只有我的应用程序使用它。
- 我已经尝试使用
actions
但与深层链接的行为相同
- 我已经尝试使用
任何建议都很好 :)
PS:我 viewing/reading 的一些参考文献:
https://www.youtube.com/watch?v=ST2W1Y_Ztvk
- 这个视频似乎用即时应用程序解决了我的问题(在谈话结束时),但是有几个问题,时间已经 运行 所以他们不得不匆忙,而且没有模型包含此用例的项目:()
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
GitHub
googlesamples
存储库
PSS:我正在积极尝试解决这个问题,如果我找到一个好的解决方案,我一定会回答。
编辑
对于对此感兴趣的任何人,因为它目前不受支持,您可以在此处加星标:https://issuetracker.google.com/issues/132170186
几分钟前我也遇到了同样的问题,我在寻找答案时看到了你的问题。
在我的例子中,我有 2 个模块 app 和 login。模块 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 声明的可能性。
有关更多信息,您还可以观看 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
。