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