Kotlin Dagger2 找不到符号 ApplicationModule_ProvideApplicationFactory
Kotlin Dagger2 cannot find symbol ApplicationModule_ProvideApplicationFactory
我正在尝试将 Dagger2 与 Kotlin 一起使用,但今天尝试编译时遇到此错误:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
Error:(5, 43) error: cannot find symbol class ApplicationModule_ProvideApplicationFactory
(应用程序)Build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.ilyarb.geotags"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
dexOptions {
javaMaxHeapSize "2048M"
}
}
kapt {
generateStubs = true
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
final SUPPORT_LIBRARY_VERSION = "23.3.0"
final PLAY_SERVICES_VERSION = "8.4.0"
compile "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
// Dagger 2
compile 'com.google.dagger:dagger:2.0.2'
kapt 'com.google.dagger:dagger-compiler:2.0.2'
provided 'org.glassfish:javax.annotation:10.0-b28'
compile "com.google.android.gms:play-services-maps:$PLAY_SERVICES_VERSION"
compile "com.google.android.gms:play-services-location:$PLAY_SERVICES_VERSION"
compile 'com.jakewharton.timber:timber:4.1.0'
compile 'com.jakewharton.byteunits:byteunits:0.9.1'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
testCompile 'junit:junit:4.12'
}
repositories {
mavenCentral()
}
buildscript {
ext.kotlin_version = '1.0.1-2'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
root build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
申请class
package com.ilyarb.geotags
import android.app.Application
import com.google.android.gms.common.api.GoogleApiClient
import com.ilyarb.geotags.injection.component.ApplicationComponent
import com.ilyarb.geotags.injection.component.DaggerApplicationComponent
import com.ilyarb.geotags.injection.module.ApplicationModule
import com.squareup.leakcanary.LeakCanary
import timber.log.Timber
import javax.inject.Inject
class GeotagApp : Application() {
@Inject lateinit var mGoogleApiClient: GoogleApiClient
companion object {
@JvmStatic lateinit var mApplicationComponent: ApplicationComponent
}
override fun onCreate() {
super.onCreate()
LeakCanary.install(this)
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(ApplicationModule(this))
.build()
mApplicationComponent.inject(this)
}
}
应用程序组件
package com.ilyarb.geotags.injection.component
import android.app.Application
import com.ilyarb.geotags.injection.module.ApplicationModule
import dagger.Component
import javax.inject.Singleton
@Singleton
@Component(modules = arrayOf(ApplicationModule::class))
interface ApplicationComponent {
fun inject(application: Application)
}
应用模块
package com.ilyarb.geotags.injection.module
import android.app.Application
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.location.LocationServices
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module
class ApplicationModule(private val mApplication: Application) {
@Provides
@Singleton
fun provideGoogleApiClient() : GoogleApiClient {
return GoogleApiClient.Builder(mApplication)
.addApi(LocationServices.API)
.build()
}
}
它生成 DaggerApplicationComponent 但是当我尝试 运行 应用程序时失败并出现此错误。
我已经尝试清理并重建项目,但没有成功。
任何帮助将不胜感激。
通过您的项目,我注意到您的一些匕首 Module
提供了名称相似的方法,例如 providesContext()
。 Dagger 2(或 kapt)可能有问题,导致你的错误。请尝试重命名它们,以便所有 @Provides
方法都有唯一的名称。
另外注解在 Kotlin 中默认有运行时保留,所以你不需要使用 @Retention(AnnotationRetention.RUNTIME)
.
我正在尝试将 Dagger2 与 Kotlin 一起使用,但今天尝试编译时遇到此错误:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
Error:(5, 43) error: cannot find symbol class ApplicationModule_ProvideApplicationFactory
(应用程序)Build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.ilyarb.geotags"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
dexOptions {
javaMaxHeapSize "2048M"
}
}
kapt {
generateStubs = true
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
final SUPPORT_LIBRARY_VERSION = "23.3.0"
final PLAY_SERVICES_VERSION = "8.4.0"
compile "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
// Dagger 2
compile 'com.google.dagger:dagger:2.0.2'
kapt 'com.google.dagger:dagger-compiler:2.0.2'
provided 'org.glassfish:javax.annotation:10.0-b28'
compile "com.google.android.gms:play-services-maps:$PLAY_SERVICES_VERSION"
compile "com.google.android.gms:play-services-location:$PLAY_SERVICES_VERSION"
compile 'com.jakewharton.timber:timber:4.1.0'
compile 'com.jakewharton.byteunits:byteunits:0.9.1'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
testCompile 'junit:junit:4.12'
}
repositories {
mavenCentral()
}
buildscript {
ext.kotlin_version = '1.0.1-2'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
root build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
申请class
package com.ilyarb.geotags
import android.app.Application
import com.google.android.gms.common.api.GoogleApiClient
import com.ilyarb.geotags.injection.component.ApplicationComponent
import com.ilyarb.geotags.injection.component.DaggerApplicationComponent
import com.ilyarb.geotags.injection.module.ApplicationModule
import com.squareup.leakcanary.LeakCanary
import timber.log.Timber
import javax.inject.Inject
class GeotagApp : Application() {
@Inject lateinit var mGoogleApiClient: GoogleApiClient
companion object {
@JvmStatic lateinit var mApplicationComponent: ApplicationComponent
}
override fun onCreate() {
super.onCreate()
LeakCanary.install(this)
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(ApplicationModule(this))
.build()
mApplicationComponent.inject(this)
}
}
应用程序组件
package com.ilyarb.geotags.injection.component
import android.app.Application
import com.ilyarb.geotags.injection.module.ApplicationModule
import dagger.Component
import javax.inject.Singleton
@Singleton
@Component(modules = arrayOf(ApplicationModule::class))
interface ApplicationComponent {
fun inject(application: Application)
}
应用模块
package com.ilyarb.geotags.injection.module
import android.app.Application
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.location.LocationServices
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module
class ApplicationModule(private val mApplication: Application) {
@Provides
@Singleton
fun provideGoogleApiClient() : GoogleApiClient {
return GoogleApiClient.Builder(mApplication)
.addApi(LocationServices.API)
.build()
}
}
它生成 DaggerApplicationComponent 但是当我尝试 运行 应用程序时失败并出现此错误。
我已经尝试清理并重建项目,但没有成功。
任何帮助将不胜感激。
通过您的项目,我注意到您的一些匕首 Module
提供了名称相似的方法,例如 providesContext()
。 Dagger 2(或 kapt)可能有问题,导致你的错误。请尝试重命名它们,以便所有 @Provides
方法都有唯一的名称。
另外注解在 Kotlin 中默认有运行时保留,所以你不需要使用 @Retention(AnnotationRetention.RUNTIME)
.