Kotlin Dagger2找不到符号ApplicationModule_ProvideApplicationFactory

时间:2016-04-11 10:04:58

标签: android gradle android-gradle kotlin dagger-2

我试图将Dagger2与Kotlin一起使用但是今天尝试编译时遇到了这个错误:

  

错误:任务':app:compileDebugJavaWithJavac'执行失败。

     

错误:(5,43)错误:找不到符号类ApplicationModule_ProvideApplicationFactory

(App)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
}

申请类

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,但是当我尝试运行应用程序时,它会因此错误而失败。

我已经尝试过清理和重建项目,但它没有用。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

通过您的项目,我注意到您的一些匕首Module提供了类似名称的方法,例如providesContext()。 Dagger 2(或kapt)可能有问题,导致您的错误。请尝试重命名它们,以便所有@Provides方法都具有唯一名称。

默认情况下,注释在Kotlin中也有运行时保留,因此您不需要使用@Retention(AnnotationRetention.RUNTIME)