前言
这两年google一直在推荐模块化开发,在github上有google官方的ArchitectureDemo。最近写了个demo,用到了ARouter,但是配置了之后,在调用的时候报这样的错误。仔细检查了一下用法是否正确。
ARouter介绍
这是阿里Android技术团队开源的一款路由框架。这款路由框架可以为我们的应用开发提供更好更丰富的跳转方案。比如支持解析标准URL进行跳转,并自动注入参数到目标页面中;支持添加多个拦截器,自定义拦截顺序(满足拦截器设置的条件才允许跳转,所以这一特性对于某些问题又提供了新的解决思路。
ARouter使用
1、在app的 gradle文件中添加声明
android {
compileSdkVersion 28
buildToolsVersion "28.0.0"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.clark.dingding"
minSdkVersion 26
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
//很多网上的资料是这么多的,但是运行了是不可以的
// arguments = [moduleName : project.getName()]
arguments = [AROUTER_MODULE_NAME : project.getName()]
}
}
}
}
dependencies {
//阿里的路由框架
implementation 'com.alibaba:arouter-api:1.5.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
}
2、在dependencies 中引入框架 如上代码
3、在Application中初始化框架,
ARouter.init(this)
4、在需要使用的activity或者fragment中注入
ARouter.getInstance().inject(this)
5、在调用的地方使用
//不带参数调用
ARouter.getInstance().build(ARouterPath.news2Activity).navigation()
带参数调用
ARouter.getInstance()
.build(ARouterPath.news2Activity)
.withTransition(R.anim.activity_up_in, R.anim.activity_up_out)
.navigation(this@NewsActivity, 2, object : NavigationCallback {
override fun onFound(postcard: Postcard?) {
Log.d("clark", "找到匹配路径")
}
override fun onLost(postcard: Postcard?) {
Log.d("clark", "没有找到匹配路径")
}
override fun onArrival(postcard: Postcard?) {
Log.d("clark", "成功跳转")
}
override fun onInterrupt(postcard: Postcard?) {
Log.d("clark", "跳转路径被中断")
}
})
更多调用方法详见 官方文档 参考文档
问题
但是我配置了所有的注意点,依旧不能实现跳转,log给出的提示为
ARouter::There is no route match the path
查了资料发现,java的项目跟kotlin的项目在调用方式上是不一样的。我的项目是用的部分kotlin代码,以下的办法可以参考解决。
第一个注意点
在app的build文件中添加
apply plugin: 'kotlin-kapt'
并修改配置声明方式,代码如下
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
id 'kotlin-kapt'
}
android {
compileSdkVersion 28
buildToolsVersion "28.0.0"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.clark.dingding"
minSdkVersion 26
targetSdkVersion 28
versionCode 1
versionName "1.0"
//java工程的声明方式
// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// javaCompileOptions {
// annotationProcessorOptions {
// arguments = [AROUTER_MODULE_NAME : project.getName()]
// }
// }
//kotlin工程的声明方式
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
}
dataBinding {
enabled = true
}
}
而且包的导入方式为,如下
//java导入包
// implementation 'com.alibaba:arouter-api:1.5.1'
// annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
//kotlin导入包
implementation 'com.alibaba:arouter-api:1.5.1'
kapt 'com.alibaba:arouter-compiler:1.5.1'
第二个注意点
要注意的是路径配置,每个module的group(默认路径的第一级)一定要不一样。比如你的app module有个页面可以用@route(path="/app/activity") 然后有个login module中的页面就不要用/app开头了,可以用@route(path="/add/activity")这样子的。
基本上额外再注意这两点就能解决跳转失败的问题了,如果依旧不能解决,欢迎大家留言探讨,我会及时回复。