Android组件化开发中使用Butterknife的坑
2017-11-16 本文已影响172人
苏简笔记
近来整理代码的时候,要对代码做一些模块化组件化的处理。想要在一个BaseLib里面引入ButterKnife,在这个BaseLib里面声明一个BaseActivty,然后其他module的Activity里面继承这个BaseActivity,直接可以使用BindView,没想到直接报NPE了。
第一反应就是把问题google了一下,搜索结果大多指向了ButterKnife的issue了。然后发现也有不少人又碰到相似的问题(看着相似其实又略有不同),按照上面的方法尝试了几个发现都没有解决这个问题。最终看到有一篇类似的博客,帮忙解决了这个问题。原文链接,在此感谢原文作者。
因为按照原文的处理方法还是碰到了一个小问题,我把这个问题解决了,重新整理了一篇文章。虽然不知道是不是最好的解决方案,那现在就先这样处理吧。
首先,需要在工程的module声明:
image.png repositories {
google()
jcenter()
maven { url "http://objectbox.net/beta-repo/" }
mavenCentral()
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
//ObjectBox
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-SNAPSHOT'
}
然后再baseLib中添加:
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
dependencies {
compile rootProject.ext.libButterKnife
}
然后在每一个Module中添加如下引用
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
dependencies {
annotationProcessor rootProject.ext.libButterKnifeCompile
}
这样就可以解决NPE的问题了。
注意, rootProject.ext.libButterKnife, rootProject.ext.libButterKnifeCompile我使用了全局的声明,如下:
libButterKnife = "com.jakewharton:butterknife:8.8.1"
libButterKnifeCompile = "com.jakewharton:butterknife-compiler:8.8.1"
版本自己更新到需要的版本。
另外,Java代码中,使用R2代替R,这样就可以实现ButterKnife在组件化开发过程中出现的空指针问题。
如果有其他更好的解决办法,也请留下您的方法,感谢。