androidx navigation 2.3.0
加入了对 dynamic feature module
的导航支持,所以咱们利用这个来分离出多个功能 module 来实现模块化java
Android App Bundle 是官方 18 年推出的动态发布方案,相似国内各类插件化方案。不过它须要 Google Play Store 支持,这致使在国内没法使用android
借着 navigation 组件支持 dynamic feature module
间导航的契机,咱们可使用 dynamic feature module
来拆分功能模块以实现模块化git
传统的拆分方案大概是这样,feature module 之间相互隔离,app module 依赖各个 feature module 间接依赖 base 库,公共库github
而使用 dynamic feature module
,其结构是这样的web
dynamic feature module
也能够按需安装,也就是说,它们可能不包含在用户最初下载的 APK 中,而是在运行时安装。而咱们能够直接将它们包含到 APK 中api
首先咱们在 base lib 中引入依赖架构
dependencies {
def nav_version = "2.3.0-alpha06" api "androidx.navigation:navigation-fragment-ktx:$nav_version" api "androidx.navigation:navigation-ui-ktx:$nav_version" api "androidx.navigation:navigation-dynamic-features-fragment:$nav_version" } 复制代码
咱们在 app module 中的 res/navigation 目录下建立 main_nav.xmlapp
接着咱们在 activity_main 中设置默认的 host编辑器
❝这里不一样于正常 navigation 的用法,没有使用 NavHostFragment,而是使用 DynamicNavHostFragmentide
❞
咱们建立 dynamic feature module ,取名为 feature1
❝这里
❞dynamic feature module
的包名前部分要和 applicationId 即 app module 包名相同,不然后续的 include 操做会有问题
这里咱们选择在安装时集成该 module
接着咱们在该 module 下建立一个 fragment 取名为 Feature1OneFragment
以后咱们直接在 main_nav.xml 中引入 该 fragment 并加入 action
接着咱们就能够在 app 下的 MainFragment 打开 Feature1OneFragment
❝个人 demo 中 feature2 是直接引入 fragment,所以跳转的是 Feature2OneFragment
❞
在 feature1 中建立 activity (demo 中为 feature2)
一样须要指定 moduleName
咱们能够为 dynamic feature module 单独配置 navigation graph,这样就能够处理 dynamic feature module 内部的跳转了
在 feature1 中建立 feature1_nav.xml ,其中 startDestination 为 Feature1OneFragment
在 main_nav.xml 咱们须要使用另一种方式来使用该 graph
咱们使用了一个新的标签 include-dynamic
,同时咱们看到了几个没用过的属性
graphPackage
为
dynamic feature module
的包名
graphResName
为
dynamic feature module
内部 graph 的名字
moduleName
为 module 名
❝注意:这里的 graphPackage 能够省略
❞
若是 module 的包名没用按照前文的格式配置会致使没法找到 graphId 的异常 include-dynamic 标签的 id 要与 feature1_nav.xml
navigation 标签下的 id 一致,或者后者不设置 id
这样从 app module 导航到 feature1 的 startDestination 后即可使用其内部的逻辑进行后续的导航了
Navigation 组件暂不支持 Dynamic include graph 的 deep link
所以我目前也没有找到特别优雅的方式,已知的方案以下
我是 Fly_with24