Dagger2 - FragmentSubcomponentBuilder 未实现 AndroidInjector.Factory
Dagger2 - FragmentSubcomponentBuilder does not implement AndroidInjector.Factory
我正在使用 dagger 2 并尝试将我的 Android 项目从 Java 转换为 Kotlin。成功构建后出现运行时错误:
MyFragmentSubcomponentBuilder 没有实现 AndroidInjector.Factory
使用 Java 时不会出现此错误。而且我还注意到,在我的模块 ActivityBuilder 中,所有方法在构建后都未使用(它们必须在生成的子组件中使用 类)。
@Module
abstract class ActivityBuilder {
// ...
@ContributesAndroidInjector(modules = arrayOf(MainActivityModule::class,MyFragmentProvider::class))
internal abstract fun bindMainActivity(): MainActivity // this method highlighted with gray color in AndroidStudio as unused
}
如何设置我的项目以正确使用 dagger 2 和 kotlin?
我的最高等级gradle.build:
buildscript {
ext.kotlin_version = '1.1.51'
repositories {
jcenter()
maven { url 'https://maven.google.com' }
mavenCentral()
google()
maven {
url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'
}
maven {
url "https://jitpack.io"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.google.gms:google-services:3.1.0'
classpath "io.realm:realm-gradle-plugin:3.0.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
// ...
和应用 build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'realm-android'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.example.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0.0"
multiDexEnabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dataBinding {
enabled = true
}
kapt {
generateStubs = true
}
}
// ...
kapt {
generateStubs = true
}
dependencies {
// ...
kapt 'com.android.databinding:compiler:3.0.0'
//Dagger 2 dependencies
compile 'com.google.dagger:dagger:2.11'
compile 'com.google.dagger:dagger-android:2.11'
compile 'com.google.dagger:dagger-android-support:2.11'
kapt 'com.google.dagger:dagger-compiler:2.11'
kapt 'com.google.dagger:dagger-android-processor:2.11'
// ...
}
如您所见,我没有为 dagger 2(仅 kapt)使用 annotationProcessor,而且我还添加了 generateStubs = true。但是我仍然在运行时出错。
将 AndroidSupportInjectionModule
放入 ApplicationComponent
中的数组模块
例如
@Singleton
@Component(
modules = arrayOf(
AndroidSupportInjectionModule::class,
ActivityBuilder::class,
AppModule::class
)
)
interface AppComponent : AndroidInjector<App> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<App>()
}
我正在使用 dagger 2 并尝试将我的 Android 项目从 Java 转换为 Kotlin。成功构建后出现运行时错误:
MyFragmentSubcomponentBuilder 没有实现 AndroidInjector.Factory
使用 Java 时不会出现此错误。而且我还注意到,在我的模块 ActivityBuilder 中,所有方法在构建后都未使用(它们必须在生成的子组件中使用 类)。
@Module
abstract class ActivityBuilder {
// ...
@ContributesAndroidInjector(modules = arrayOf(MainActivityModule::class,MyFragmentProvider::class))
internal abstract fun bindMainActivity(): MainActivity // this method highlighted with gray color in AndroidStudio as unused
}
如何设置我的项目以正确使用 dagger 2 和 kotlin?
我的最高等级gradle.build:
buildscript {
ext.kotlin_version = '1.1.51'
repositories {
jcenter()
maven { url 'https://maven.google.com' }
mavenCentral()
google()
maven {
url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'
}
maven {
url "https://jitpack.io"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.google.gms:google-services:3.1.0'
classpath "io.realm:realm-gradle-plugin:3.0.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
// ...
和应用 build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'realm-android'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.example.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0.0"
multiDexEnabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dataBinding {
enabled = true
}
kapt {
generateStubs = true
}
}
// ...
kapt {
generateStubs = true
}
dependencies {
// ...
kapt 'com.android.databinding:compiler:3.0.0'
//Dagger 2 dependencies
compile 'com.google.dagger:dagger:2.11'
compile 'com.google.dagger:dagger-android:2.11'
compile 'com.google.dagger:dagger-android-support:2.11'
kapt 'com.google.dagger:dagger-compiler:2.11'
kapt 'com.google.dagger:dagger-android-processor:2.11'
// ...
}
如您所见,我没有为 dagger 2(仅 kapt)使用 annotationProcessor,而且我还添加了 generateStubs = true。但是我仍然在运行时出错。
将 AndroidSupportInjectionModule
放入 ApplicationComponent
例如
@Singleton
@Component(
modules = arrayOf(
AndroidSupportInjectionModule::class,
ActivityBuilder::class,
AppModule::class
)
)
interface AppComponent : AndroidInjector<App> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<App>()
}