多module的項目中使用ARouter時報錯ARouter::There is no route match the path [/xxx/xxx], in group [xxx][]

本文只說明在一個具有多個module的Android項目中使用ARouter進行頁面跳轉(本次測試了Activity之間跳轉)時遇到如題報錯的解決方式,文中涉及到了ARouter的最基本的使用方式,但是不會涉及到ARouter的高級使用方式,具體的可以參考ARouter在GitHub上的使用說明https://github.com/alibaba/ARouter或者其他的博客。而且本文中提到的出錯原因可能是最常見的,說"最常見"的意思是可能還有其他的很多不同原因會導致這樣的報錯,用本文的方式無法解決,如果確實這樣,就需要各位再探索其他的答案了,下面開始說正題。

本文說了一大堆,實際上總結起來就三句話,知道這三句總結是怎麼回事的話,完全不用看下文了,不明白的時候就看看下文的舉例。

1.多個module之間互相跳轉,每個module中都要進行同樣的配置。也就是都引入ARouter的兩個庫以及都在各自的build.gradle文件中進行如下配置(這是使用Java開發的情況,使用kotlin的話還得翻到下邊去看):

android {
    defaultConfig {
        ......
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }

    }
}

當然,ARouter的初始化也要做,只在應用入口處(比如Application類中)調用一次就行了。

2.不同的module不要使用相同的第一級路由名稱,這樣的話只能打開第一個使用該一級路由的activity,其他的就打不開了(需要看源碼分析原因)。從第二級開始可以一樣,但是最好第二級...以至後面的多級都不一樣。比如下面兩幅圖,這是在兩個不同的module中的Activity,其中畫框的部分的a和b是各自的第一級目錄,如果你這裏的一級目錄名稱一樣,那麼很可能就會造成如題的問題。

3.千萬不要Java和kotlin混着用。千萬不要Java和kotlin混着用。千萬不要Java和kotlin混着用。使用ARouter從Java寫的Activity跳轉到kotlin寫的Activity,或者是倒過來,都不行...(目前的個人經歷)而且如果純kotlin,那在build.gradle的配置也要用kotlin的方式,看文章最後邊的說明。

行了,如果上面看完了還不懂,就接着看下邊的例子吧。

圖1.

如上圖1.這個項目中總共有四個module,其中三個是library的形式,另外一個是普通的可運行的應用(application)。這四個module的依賴關係是a_lib和b_lib依賴於baselibrary,而app依賴於a_lib和b_lib,而且在a_lib和b_lib中依賴baselibrary使用的是api的方式,不是implementation/compile(過時),也就是說app間接的依賴了baselibrary。如下圖a_lib中依賴baselibrary的舉例:

圖2.

使用api的依賴方式一般的應該都知道什麼意思,就是說它所依賴的module也可以被"繼承"到其他的module中,具體到本文中就是說app依賴了a_lib這個module,而a_lib以api方式依賴的其他第三方庫之類的都可以被app"繼承"依賴,也叫“間接”依賴。

開始說ARouter在這幾個module之間的使用方式,本文主要針對使用Java和kotlin兩種情況去說,差別不大:

一. 在Java中:

如果配置部分不想看,直接跳過就行。

首先,肯定是先引入ARouter這個開源庫以及完成人家要求的配置,主要就是涉及到

implementation 'com.alibaba:arouter-api:?'
annotationProcessor 'com.alibaba:arouter-compiler:?'

這兩個庫,具體的版本在GitHub上看一下,自己替換了問號?部分就行。

其次,在build.gradle文件的android{...}進行如下配置:

圖3.

最後,是初始化ARouter,官方建議這個初始化的操作儘早做,那就是Application中最合適了,如下圖:

圖4.

圖中除了ARouter.init(...)的調用就是兩個openXxx的方法了,個人感覺這在調試的時候很有必要,這樣才能看到日誌中是否成功的使用ARouter做頁面跳轉了,通過在logicat中過濾關鍵字ARouter就能看到相關的日誌。

OK,配置方式就這麼三步,GitHub上都有說明,這裏又重複一次。但是注意的是上邊的a_lib,b_lib,baselibrary以及app中都要進行同樣的配置纔行,要不然無法進行module間的跳轉,只能進行module內的跳轉。

(ps:其實單純對我這個例子來說,因爲baselibrary中添加了com.alibaba:arouter-api:xxx,而且是以api的方式引用的,所以其他直接依賴或間接依賴它的module來說,都不用單獨引用這個庫了,但是另外一個註解庫都需要使用,因爲那個不同"繼承").

這樣,就解釋完了最開始的第一句總結,那第二句和第三句總結已經很明白了,這裏就不說了,下邊說使用Kotlin的方式,整體流程一樣,主要區別就是java和kotlin使用的註解解釋器不同了。

2.在Kotlin中主要兩點不同:

2.1 第一點不同是引入com.alibaba:arouter-compiler:xxx這個庫時,不能再用Java中的註解解釋器,也就是不能用annotationProcessor了,要用kapt,也就是下圖這樣:

圖5.

這是kotlin中解釋註解的插件,所以還需要引入這個插件纔行,如下圖:

圖6.

2.2 第二點不同就是圖3中的配置,要改成下邊這樣的:

圖7.

 

然後,就沒了......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章