ARouter there's no route matched解决方法

本文分析了ARouter路由框架中出现there’s noroute matched错误的原因,并通过源码阅读找到问题所在,最后给出了不同模块间一级路径必须不同的解决方案。

原因

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

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

GroupGroup
app就是这个寻找地址的自动生成类。
这时候我们在编译器中寻找一下这个的代码,意外发现有两个ARouter
GroupGroup
app存在。

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

总结

分析和原因解释比较简单,至于怎么解决,就一句话:
不同module的一级路径必须不同,否则会导致一个moudle中的一级路径失效!!!

"no Route matched with those values" 是一个常见的错误提示,特别是在使用Web框架(如Django、Flask等)进行开发时。这个错误通常表示请求的URL与任何已定义的路由都不匹配。具体来说,可能有以下几个原因: 1. **URL路径错误**:请求的URL路径与任何已定义的路由都不匹配。 2. **视图函数未定义**:请求的URL对应的视图函数未定义或未正确配置。 3. **路由配置错误**:路由配置可能有误,导致无法匹配到正确的视图函数。 4. **参数不匹配**:请求的URL参数与路由定义中的参数不匹配。 ### 解决方法 1. **检查URL路径**:确保请求的URL路径与路由定义中的路径完全匹配。 2. **确认视图函数**:确保对应的视图函数已定义并且正确配置。 3. **检查路由配置**:仔细检查路由配置,确保没有拼写错误或路径错误。 4. **参数匹配**:确保请求的URL参数与路由定义中的参数匹配。 ### 示例 假设我们使用Flask框架,定义了一个简单的路由: ```python from flask import Flask app = Flask(__name__) @app.route('/hello') def hello(): return 'Hello, World!' if __name__ == '__main__': app.run(debug=True) ``` 如果访问`http://localhost:5000/hello`,会看到"Hello, World!"。但是,如果访问`http://localhost:5000/hello/world`,则会看到"no Route matched with those values"错误。 ### 解决方法 1. **添加新的路由**:在Flask应用中添加一个新的路由来处理`/hello/world`路径。 ```python @app.route('/hello/world') def hello_world(): return 'Hello, World! This is a new route.' ``` 2. **使用变量规则**:如果希望匹配带有参数的URL,可以使用变量规则。 ```python @app.route('/hello/<name>') def hello_name(name): return f'Hello, {name}!' ``` 这样,访问`http://localhost:5000/hello/world`时,会看到"Hello, world!"。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值