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在组件化开发过程中出现的空指针问题。

如果有其他更好的解决办法,也请留下您的方法,感谢。

上一篇下一篇

猜你喜欢

热点阅读