很久很久...以前就想开始写博客了,可惜不是时间不够就是自己贪玩。今天好像突然想起了这件事,哈哈。就这劲写一篇。
这篇博客也主要记录一下自己的前段时间探索组件化初试时的一些坑。
在前期了解了一些相关组件化知识后,最后也选择了使用Arouter作为路由框架,为什么这里也不在赘述了,其实很简单,经过大厂长时间的迭代优化的库肯定比自定义的要稳定。
前期的项目配置大家可以github了解下 点这里 或者用下面的
// java
apply plugin: 'com.alibaba.arouter'
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// Replace with the latest version
compile 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
...
}
// kotlin
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
dependencies {
// Replace with the latest version
compile 'com.alibaba:arouter-api:1.3.1'
apt'com.alibaba:arouter-compiler:1.1.4'
...
}
注意这里:如果你的项目只是部分页面也入了kotlin也要使用kotlin的配置方式!!!
因为此次我想把项目中的商城模块登录、商城等模块抽出来,方便以后管理代码就不方便贴了,但遇到的小问题顺便记录了,希望可以帮到初学者。
1、若你的as是3.0以及以后的新版本项目中抽取的base库其中的依赖前缀可能需要使用api替代
implementation,包括jar包的引用:两者区别其实也就是private与public的区别差不多
// jar包
api fileTree(include: ['*.jar'], dir: 'libs')
// 普通
api 'com.google.code.gson:gson:2.8.5'
其中还有就是如果你的项目有aar,可直接在项目根目录配置,以便主模块和lib模块使用
allprojects {
repositories {
jcenter()
flatDir { // 保证aar每个model都能引用到
dirs project(':你的含有aar的lib名').file('libs')
}
}
}
然后在含有aar的lib中
api name: '你的含有aar的lib名', ext: 'aar'
2、其实注意点1还好,当时还有个头疼的问题:butterknife的问题
首先因为butterknife新版使用了注解,这不是重点,重要的是当与kotlin共用时,莫名给我报了个空指针,所有注解的view都是null,当时有点懵逼,以为插模块拆的,后来才发现一时疏忽cv大法粘多了,箭头部分是不需要!!!
其次最难弄的还是子lib中也是用了butterknife,因为原来其实知道这个问题,所以一直不太喜欢用这个库,但项目初期队友就用上了。。。所以项目架构选型时,感觉大家可以根据业务方先抉择下,而且若项目使用kotlin的话没有在使用butterknife的必要了,因为可以直接用id取代掉了。
因为项目使用了,但现阶段的抽取页面相对较少索性我直接使用了原生的findById,方正根据作者的解决办法也是修改R为R2,工作量差不太多。
此外大家需要注意的是,还有一个比较恶心的东西,设置点击事件时,如果使用swich语句统一管理的话类似这种:
switch (view.getId()) {
case R.id.iv_photo:
break;
case R.id.tv_photo:
break;
}
不管你子lib是没是用butterknife都会报错,因为其生成的注解文件中没能使用final修饰,然后就没有然后了,换成if else吧。。。