Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin Dagger2 cannot find symbol ApplicationModule_ProvideApplicationFactory

I'm trying to use Dagger2 with Kotlin but today trying to compile got this error:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.

Error:(5, 43) error: cannot find symbol class 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
}

Application 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)
    }

}

Application Component

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)

}

Application Module

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

}

It generates DaggerApplicationComponent but when i try to run application it fails with this error.

I've already tried to clean and rebuild the project but it didn't work.

Any help will be greatly appreciated.

like image 483
Илья Рябчук Avatar asked Oct 31 '22 05:10

Илья Рябчук


1 Answers

Looking through your project I noticed some of your dagger Modules have providing methods with similar names like providesContext(). Dagger 2 (or kapt) may have a problem with it, which results in your error. Please try renaming them, so that all @Provides methods have unique names.

Also annotations have the runtime retention in Kotlin by default, so you don't need to use @Retention(AnnotationRetention.RUNTIME).

like image 185
AndroidEx Avatar answered Nov 07 '22 20:11

AndroidEx