ARouter there's no route matched解決方法

緣由

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中的一級路徑失效!!!

相關文章
相關標籤/搜索