Kotlin中使用ButterKnife,注解@BindView
习惯使用了java,那么正常情况下我们集成ButterKnife如下:
第一步:
android {
// Butterknife requires Java 8.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}
第二步:
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'
}
}
第三步:
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
然后我们就可以正常的代码中使用了,如下所示:
class Main2Activity extends Activity {
@BindView(R2.id.user)EditText username;
@BindView(R2.id.pass)EditText password;
@OnClick(R.id.button)
fun changeText(){
textView.setText("test kotlin")
}
...
}
但是,但是,注意了:当我们在kotlin中使用ButterKnife时,你会发现如上配置是有问题的
我们知道,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class
按以上步骤,在kotlin中使用Butterknife,你会发现压根没有对应的class生成
Butterknife会为每一个类生成一个 classname_ViewBinding 的类,而事实上以下的配置并没有生成这个类,自然所有的注解绑定操作都不会生效的.那么我们可以确定一定是在编译期出现问题.
事实也是如此,kotlin有自己的注解处理器 kapt,在 Kotlin 中添加依赖与 Java 中类似,仅需要使用 Kotlin 注解处理工具(Kotlin Annotation processing tool,kapt)替代 annotationProcessor 即可
我们只需对如上配置稍做修改:
第三步中添加:
applyplugin:'kotlin-kapt'
第一步中:将
dependencies {
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}改为:
dependencies {
implementation 'com.jakewharton:butterknife:10.1.0'
kapt 'com.jakewharton:butterknife-compiler:10.1.0'
}
由此,所有注解生效,问题解决,一个很简单的问题