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中的一级路径失效!!!

相关文章
相关标签/搜索