ARouter是一個組件化開發經常使用的一個路由框架,它能夠很方便的讓咱們進行組件之間的跳轉。可是隨着module的增多咱們很容易出現there's no route matched的錯誤,出現這種問題會讓咱們在開發的時候很麻煩,卻又沒有報錯的日誌讓咱們查看。 在百度了不少以後發現網上的方法都不能解決個人問題,因而經過簡單的源碼閱讀,找到了問題所在。app
#分析框架
Aouter的具體使用便再也不說了,下面首先從Aouter的使用方法入手:組件化
ARouter.getInstance().build(path).navigation();
複製代碼
直接ctrl點進代碼,顯示調用順序:post
再繼續點進去:ui
LogisticsCenter.completion(postcard);
複製代碼
查看這個方法的源碼:spa
在這裏終於找到了「There is no route match the path」這個提示的產生地方。日誌
這是一個尋找router path的一段代碼,簡單的來講,就是找到了就進行路由跳轉,找不到就提示錯誤。code
public synchronized static void completion(Postcard postcard) {
if (null == postcard) {
throw new NoRouteFoundException(TAG + "No postcard!");
}
//查找RouteMeta對象,若是存在說明路由成功,若是失敗說明尚未被加載或者這個path就是錯誤的
RouteMeta routeMeta = Warehouse.routes.get(postcard.getPath());
if (null == routeMeta) {
// 經過groupsIndex去找IRouteGroup的實現類
Class<? extends IRouteGroup> groupMeta = Warehouse.groupsIndex.get(postcard.getGroup());
if (null == groupMeta) {
throw new NoRouteFoundException(TAG + "There is no route match the path [" + postcard.getPath() + "], in group [" + postcard.getGroup() + "]");
} else {
// 經過反射獲取IRouteGroup的實現類,而後加載到內存
IRouteGroup iGroupInstance = groupMeta.getConstructor().newInstance();
iGroupInstance.loadInto(Warehouse.routes);
// 加載到內存後Warehouse.groupsIndex去掉這個group
Warehouse.groupsIndex.remove(postcard.getGroup());
}
} else {
//查找到路由地址
。。。。。
}
}
複製代碼
IRouterGroup的實現類以下:router
這裏的path都是"/app/xxxx/",Aouter 要求path必須有至少兩級的路徑,是由於Arouter在尋找route的時候,是經過第一級路徑,也就是這裏的"app"來尋找的。Aouter經過"app"找到了route,而且在groupIndex中刪除了這個路徑,表明已經加載到了內存。ARouter$$Group$$app就是這個尋找地址的自動生成類。
這時候咱們在編譯器中尋找一下這個的代碼,意外發現有兩個ARouter$$Group$$app存在。cdn
如今的問題已經很明顯了,不一樣的module使用了相同的一級路徑,在Arouter第一次尋找到route的時候便刪除了這個一級路徑的group,由於一級路徑的重複,再調用另外一個module的一級路徑是"app"的路由時,因爲以前Warehouse.groupsIndex已經刪除,便致使了there's no route matched的錯誤。
分析和緣由解釋比較簡單,至於怎麼解決,就一句話:
不一樣module的一級路徑必須不一樣,不然會致使一個moudle中的一級路徑失效!!!