MrLeblond
MrLeblond

Reputation: 1035

Dagger2 and Kotlin run failed cause by :app:compileDebugKotlinAfterJava

I'm trying to implement Dagger 2 in a test app to learn Clean Architecture and dependancy injection in Kotlin language.

EDIT :
I can compile thanks to @Logain, but I have always the static member problem with Dagger in my singleton (see below my TaskWorker), so I'm looking for how can I fix this error

But i got a problem, my DaggerComponent is well generated when i do a rebuild, but not when i want to run my app for testing, it fails and disappears. It fails with this error :

Error:(21, 29) Unresolved reference: DaggerInjectorComponent

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

> Compilation error. See log for more details

While when i do a rebuild, this task is passed correctly

:app:compileDebugKotlinAfterJava

So i don't understand why it fails.

Here is my InjectorComponent :

@Singleton
@Component(modules = arrayOf(ContextDaggerModule::class, LocalStoreDaggerModule::class))
interface InjectorComponent {

    fun inject(realmLocalStore: RealmLocalStore)

    fun inject(taskWorker: TaskWorker)

}

ContectDaggerModule :

@Module
class ContextDaggerModule (val app: Application) {

    @Provides
    @Singleton
    fun provideContext(): Context = app

    @Provides
    @Singleton
    fun provideApplication(): Application = app

    @Provides
    @Singleton
    fun provideResources(): Resources = app.resources

}

LocalStoreDaggerModule :

@Module
class LocalStoreDaggerModule {

    @Provides
    @Singleton
    fun provideLocalStore(context: Context): LocalStore {
        return RealmLocalStore(context)
    }

}

I think the problem is caused because I inject dependencies in Object-declarations but all elements are static and Dagger does not appreciate it. So, i try to hack it with a simple override getter and injecting data but nop.

Here is my "hack" :

object TaskWorker {

    // @Inject lateinit var localStore: LocalStore
    // Not work cause it's a static variable

    var localStore: LocalStore? = null
        @Inject
        get() = localStore

    // some cool function
}

I follow this code and this tutorial

I use these dependencies :

//  Dagger2
    compile 'com.google.dagger:dagger:2.11'
    kapt 'com.google.dagger:dagger-compiler:2.11'
    provided 'org.glassfish:javax.annotation:10.0-b28'

Upvotes: 3

Views: 395

Answers (2)

johnny_crq
johnny_crq

Reputation: 4391

You don't need this.

kapt {
    generateStubs = true
}

Just apply the plugin:

apply plugin: 'kotlin-kapt'

and add the dependencies:

compile androidDependencies.dagger2
compile androidDependencies.dagger2Android
kapt androidDependencies.dagger2Kapt

sometimes the tasks fail with errors like that. Try to clean and as last resort use invalidate and restart. Most of the times it works.

Upvotes: 0

Logain
Logain

Reputation: 4374

Make sure you are using:

kapt {
    generateStubs = true
}

Due to some limitations on kapt

Or just try with:

annotationProcessor 'com.google.dagger:dagger-compiler:2.11'

Upvotes: 1

Related Questions