【奇技淫巧】使用 Navigation + Dynamic Feature Module 實現模塊化

androidx navigation 2.3.0 加入了對 dynamic feature module 的導航支持,所以咱們利用這個來分離出多個功能 module 來實現模塊化java

navigation 2.3.0 更新
navigation 2.3.0 更新

國內基本不用的 dynamic feature module

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 架構
dynamic feature 架構

dynamic feature module 也能夠按需安裝,也就是說,它們可能不包含在用戶最初下載的 APK 中,而是在運行時安裝。而咱們能夠直接將它們包含到 APK 中api

使用 dynamic feature module

首先咱們在 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

main_nav.xml
main_nav.xml

接着咱們在 activity_main 中設置默認的 host編輯器

默認 host
默認 host

這裏不一樣於正常 navigation 的用法,沒有使用 NavHostFragment,而是使用 DynamicNavHostFragmentide

直接跳轉 fragment

咱們建立 dynamic feature module ,取名爲 feature1

建立 dynamic feature module
建立 dynamic feature module
包名前部分需保證與 applicationId 相同
包名前部分需保證與 applicationId 相同

這裏 dynamic feature module 的包名前部分要和 applicationId 即 app module 包名相同,不然後續的 include 操做會有問題

選擇加載模式
選擇加載模式

這裏咱們選擇在安裝時集成該 module

接着咱們在該 module 下建立一個 fragment 取名爲 Feature1OneFragment

以後咱們直接在 main_nav.xml 中引入 該 fragment 並加入 action

直接引入 fragment
直接引入 fragment

接着咱們就能夠在 app 下的 MainFragment 打開 Feature1OneFragment

啓動 fragment
啓動 fragment

個人 demo 中 feature2 是直接引入 fragment,所以跳轉的是 Feature2OneFragment

直接跳轉 activity

在 feature1 中建立 activity (demo 中爲 feature2)

跳轉 activity
跳轉 activity

一樣須要指定 moduleName

啓動activity
啓動activity

使用 dynamic feature module 內部的 graph

咱們能夠爲 dynamic feature module 單獨配置 navigation graph,這樣就能夠處理 dynamic feature module 內部的跳轉了

在 feature1 中建立 feature1_nav.xml ,其中 startDestination 爲 Feature1OneFragment

feature1_nav.xml
feature1_nav.xml

在 main_nav.xml 咱們須要使用另一種方式來使用該 graph

include-dynamic
include-dynamic

咱們使用了一個新的標籤 include-dynamic,同時咱們看到了幾個沒用過的屬性

  • graphPackagedynamic feature module 的包名
  • graphResNamedynamic feature module 內部 graph 的名字
  • moduleName 爲 module 名

注意:這裏的 graphPackage 能夠省略

  1. 若是 module 的包名沒用按照前文的格式配置會致使沒法找到 graphId 的異常
  2. include-dynamic 標籤的 id 要與 feature1_nav.xml navigation 標籤下的 id 一致,或者後者不設置 id

這樣從 app module 導航到 feature1 的 startDestination 後即可使用其內部的邏輯進行後續的導航了

include 跳轉
include 跳轉

feature module 間跳轉

暫不支持 deep link
暫不支持 deep link

Navigation 組件暫不支持 Dynamic include graph 的 deep link

所以我目前也沒有找到特別優雅的方式,已知的方案以下

demo

關於我

我是 Fly_with24

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息