在組件化開發中Butterknife的使用存在許多的問題,最開始的時候我覺得直接引入Butterknife直接引入到項目中就能夠了呢!可是後來發現不行,會有各類各樣的錯誤,因此用這篇文章記錄一下,防止其餘人採坑!!!android
在Butterknife的GitHub官網中是這麼描述關於在Library中集成的!git
先來講一下項目,咱們是在公共modules中引入了一些基礎組件的!因此個人主要的一些引用都放在那個基礎模塊中去了!其實這個基礎組件也就至關於一個類庫而已了!github
這些都是我在集成的時候遇到的問題,咱們一個一個解決上面的問題;api
只要是配置正確的話(親測可用),不會出現編譯不經過的問題,可是這裏要注意的就是各個配置的位置!!!bash
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
複製代碼
請注意這裏使用的不是最新的版本(當前最新版本是8.8.1),這裏使用的是8.4.0這個版本,別問我爲何!我是真的不知道,若是換成最新的話,各類報錯!請原諒個人無知,就醬紫。。。app
總體代碼以下:組件化
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:$localGradlePluginVersion"
//爲了解決Butterknife組件化開發中的問題,可是這裏只能是8.4.0、8.5.0、8.5.1
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
}
複製代碼
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
複製代碼
這裏爲何只添加了一個,沒有添加另外一個呢?由於我項目中把基礎類庫分到了相應的module中,因此這裏這麼寫呢?由於**'com.jakewharton:butterknife:8.8.1'這個東西要寫在相應的library module**中,不然會報相應的空指針。因此才把這兩個內容分開的!gradle
總體代碼以下:ui
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.jinlong.used"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//引入基礎包,這個基礎包是總體是一些基礎的數據
implementation project(':modules:common')
//引入butterknife
//這個東西必定要放在這個裏面,不然會報錯的(空指針)!
annotationProcessor "com.jakewharton:butterknife-compiler:$butterknifeVersion"
}
複製代碼
別管我寫的亂七八糟的,那個是便於版本管理的!google
api 'com.jakewharton:butterknife:8.8.1'
複製代碼
細心的朋友可能會問?這個api是個什麼鬼?這裏爲何用api呢?實際上是這樣的,在Android studio 3.1.2以後的版本中(聽說是由於編譯更快):
總體代碼以下:
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
//這裏踩了一個坑 implementation 只能是在模塊內部使用而api則是其餘模塊能夠使用
//compile 要用 implementation 或 api 替換
//testCompile 要用 testImplementation 或 testApi 替換
//androidTestCompile 要用 androidTestImplementation 或 androidTestApi 替換
implementation fileTree(dir: 'libs', include: ['*.jar'])
api "com.android.support:appcompat-v7:$rootProject.appcompatVersion"
api "com.android.support.constraint:constraint-layout:$rootProject.constraintLayoutVersion"
testImplementation "junit:junit:$rootProject.junitVersion"
androidTestImplementation "com.android.support.test:runner:$rootProject.runnerVersion"
androidTestImplementation "com.android.support.test.espresso:espresso-core:$rootProject.espressoCoreVersion"
//引入butterknife
api "com.jakewharton:butterknife:$butterknifeVersion"
}
複製代碼
apply plugin: 'com.jakewharton.butterknife'
複製代碼
這句添加在最上面(也就是你判斷是組件仍是module的地方),就能夠了!
會對你幫助很大的!相信我!!!不懂得能夠百度一下,上面有安裝和使用方法
以上就能夠愉快的解決組件化開發中butterknife的使用了
上面的一些注意事項好好看看,上面的那些問題,在注意事項中都會找到答案的!!!
2018年08月06日補充 其實我以爲組件化仍是不要用黃油刀了,爲何呢?其實我在上面的內容中發現一個事情,當組件化單獨運行Model的時候,全部R2都會報錯,若是說這個時候你要是一個一個改的話,那麼太累了!但若是說你說我不切換的話,也就失去了組件化的意義,利弊本身權衡吧!