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).