美文网首页
Android组件化开发中使用Butterknife的坑

Android组件化开发中使用Butterknife的坑

作者: 苏简笔记 | 来源:发表于2017-11-16 17:03 被阅读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在组件化开发过程中出现的空指针问题。

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

    相关文章

      网友评论

          本文标题:Android组件化开发中使用Butterknife的坑

          本文链接:https://www.haomeiwen.com/subject/kmtrvxtx.html