ARouter学习笔记(Kotlin脱坑之路)
本文只针对本人在Kotlin中使用ARouter出现的各种问题
附:模块化工程模块间存在相互依赖关系
组件化工程模块间不存在横向相互依赖(ARouter作用旨在解耦两个模块间依赖关系)
例如:项目中存在:主模块 B模块 C模块
模块化:B模块中页面访问C模块页面,需要主模块依赖B模块,同时B模块依赖C模块
ARouter组件化:B模块中页面访问C模块页面,需要主模块依赖B模块和依赖C模块,BC模块间没有依赖关系
一、配置项目build.gradle文件(可选配置)
apply plugin: 'com.alibaba.arouter'//可选
buildscript {
ext.kotlin_version = '1.3.31'
ext.arouter_register_version = '1.0.2'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
classpath "com.alibaba:arouter-register:$arouter_register_version"//可选
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
二、配置app Module中的build.gradle文件
注意:
1、使用kapt
进行依赖
2、所有使用到ARouter的Module中都要按如下方式添加依赖
3、app(主入口)Module中一定要添加其他Module的依赖
...
apply plugin: 'kotlin-kapt'
android {
...
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
}
dependencies {
...
//阿里ARouter框架
api 'com.alibaba:arouter-api:1.4.1'
//或者 implementation 'com.alibaba:arouter-api:1.4.1'
kapt 'com.alibaba:arouter-compiler:1.2.2'
//app Module中在此处添加若干需要使用到ARouter的Module依赖,但这些Module间不用相互依赖,即可通过ARouter相互通信
implementation project(':baselibrary')
...
}
三、问题汇总
问题一:弹窗提示:
W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]
原因:
1、app(主入口)Module中未添加使用到的Module的依赖
2、com.alibaba:arouter-compiler
未使用kapt
依赖(compiler依赖出错)
问题二:报错日志
com.alibaba.android.arouter.exception.HandlerException: ARouter::Extract the default group failed, the path must be start with '/' and contain more than 2 '/'!
原因:在ARouter的path时格式不对,在path中一定要是两级路径并包含两个“/”,例如:
正确:
@Route(path = "/app/MainActivity")//注意path中"/"个数
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ARouter.getInstance().inject(this)//使用ARouter前一定要在onCreate中调用这行代码
btn_1.setOnClickListener{v->
//注意path中"/"个数
ARouter.getInstance().build("/testlibrary/MainActivity").navigation()
}
}
}
错误:
@Route(path = "app/MainActivity")///注意path中"/"个数
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ARouter.getInstance().inject(this)//使用ARouter前一定要在onCreate中调用这行代码
btn_1.setOnClickListener{v->
///注意path中"/"个数
ARouter.getInstance().build("testlibrary/MainActivity").navigation()
}
}
}
问题三:build报错:
警告: 来自注释处理程序 'org.jetbrains.kotlin.kapt3.base.ProcessorWrapper' 的受支持 source 版本 'RELEASE_7' 低于 -source '1.8'
原因:source 版本过高引起的,但不会导致程序无法运行。
注:如果程序无法运行可能是其他原因造成,请检查Run build报红部分
问题四:使用
@Autowired
注解后,build报错:ARouter::Compiler An exception is encountered, [The inject fields CAN NOT BE 'private'!!! please check field [*] in class [*.*.*.MainActivity]]
注意:
- 使用
@Autowired
注解时一定要在onCreate
方法中使用如下代码ARouter.getInstance().inject(this)
- 使用
@Autowired
注解的变量一定要初始化,尽量少用lateinit
字段
原因:注解使用错误,1、注解的变量是私有变量,2、未添加@JvmField
注解
例如:
错误示范1:
@Autowired(name = Constants.INTENT_DATA_KEY.KEY1)
private var msg = -1
错误示范2:
@Autowired(name = Constants.INTENT_DATA_KEY.KEY1)
var msg = -1
正确示范:
@JvmField
@Autowired(name = Constants.INTENT_DATA_KEY.KEY1)
var msg = -1
四、配置问题排查方法
1.清理本地缓存,然后重新编译(大部分情况都是缓存的问题)
2.App层 是否引入了对应的module
3.检查build->generated->source->apt(kapt)是否生成了对应的映射
4.检查每个gradle 中是否正确配置了 相应库的 引用.
5.检查 moduleName 是否正确配置
5.检查 不同module 中 activity 或者 fragment 的path 或者 group 是否有错误
注:方法来自“半截铅笔”的博客——Android ARouter 集成 注意点(Kotlin)
五、 推荐
ARouter项目地址
Alibaba-ARouter 源码分析笔记
探索Android路由框架-ARouter之基本使用(一)
Android ARouter 集成 注意点(Kotlin)