博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARouter there's no route matched解决方法
阅读量:7142 次
发布时间:2019-06-29

本文共 1951 字,大约阅读时间需要 6 分钟。

原因

ARouter是一个组件化开发常用的一个路由框架,它可以很方便的让我们进行组件之间的跳转。但是随着module的增多我们很容易出现there's no route matched的错误,出现这种问题会让我们在开发的时候很麻烦,却又没有报错的日志让我们查看。 在百度了很多之后发现网上的方法都不能解决我的问题,于是通过简单的源码阅读,找到了问题所在。

#分析

Aouter的具体使用便不再说了,下面首先从Aouter的使用方法入手:

ARouter.getInstance().build(path).navigation();复制代码

直接ctrl点进代码,显示调用顺序:

再继续点进去:

发现最终调用的方法是:

LogisticsCenter.completion(postcard);复制代码

查看这个方法的源码:

在这里终于找到了“There is no route match the path”这个提示的产生地方。

代码分析

这是一个寻找router path的一段代码,简单的来说,就是找到了就进行路由跳转,找不到就提示错误。

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
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的实现类如下:

这里的path都是"/app/xxxx/",Aouter 要求path必须有至少两级的路径,是因为Arouter在寻找route的时候,是通过第一级路径,也就是这里的"app"来寻找的。Aouter通过"app"找到了route,并且在groupIndex中删除了这个路径,代表已经加载到了内存。ARouter$$Group$$app就是这个寻找地址的自动生成类。

这时候我们在编译器中寻找一下这个的代码,意外发现有两个ARouter$$Group$$app存在。

现在的问题已经很明显了,不同的module使用了相同的一级路径,在Arouter第一次寻找到route的时候便删除了这个一级路径的group,因为一级路径的重复,再调用另一个module的一级路径是"app"的路由时,由于之前Warehouse.groupsIndex已经删除,便导致了there's no route matched的错误。

总结

分析和原因解释比较简单,至于怎么解决,就一句话:

不同module的一级路径必须不同,否则会导致一个moudle中的一级路径失效!!!

转载地址:http://bnwgl.baihongyu.com/

你可能感兴趣的文章
matlab中怎样加入凝视
查看>>
虚拟机 开发板 PC机 三者之间不能ping通的各种原因分析
查看>>
【Linux】Linux 目录结构
查看>>
001-权限原理基础知识
查看>>
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
查看>>
nod32的内网在线更新设置
查看>>
组网小常识
查看>>
再谈 apache设置virtualhost + apache的一些相关设值
查看>>
express框架
查看>>
Linux 上安装oracle客户端
查看>>
Objective-C多态:动态类型识别+动态绑定+动态加载
查看>>
select(Linux 编程)
查看>>
试读《你好哇,程序猿——漫话程序猿面试求职、升职加薪、创业与生活》
查看>>
Java生成读取条形码和二维码图片
查看>>
JMeter性能测试中控制业务比例
查看>>
[Android] SQLite数据库之增删改查基础操作
查看>>
面试题总结
查看>>
MySql常用 join 详解
查看>>
安装二维码、条形码识别工具zbar
查看>>
非“云”勿扰——情人节专场
查看>>