Search code examples
kotlindagger-2

Dagger and Kotlin. Dagger doesn't generate component classes


I'm new with kotlin and Dagger. I have a little problem that I do not how to solve and I don't find a solution.

So this is what I have:

@Module
class AppModule (app: Application) {
    private var application: Application;

    init {
        this.application = app;
    }

    @Provides fun provideApplication(): Application? {
        return application;
    }

    @Provides fun provideResources(): Resources? {
        return application.resources;
    }
}

@Singleton
@Component(modules =  arrayOf(AppModule::class))
interface AppComponent: AppComponentBase {

    public class Initializer {
        private constructor(){}

        companion object {
            fun Init(app: Application): AppComponent? {
                return DaggerAppComponent.builder().appModule(AppModule(app)).build()
            }
        }
    }
}

AppComponentBase: This interface contain all the methods needed by this component.

Now, the problem is that this DaggerAppComponent class is not generated by Dagger if I do this DaggerAppComponent.builder().appModule(AppModule(app)).build() invocation within the companion object. If a invoke the same line any were by the companion object dagger generate de class without any problem.

An other thing I did look for a solution was create an other different class with the same structure, and importe the DaggerAppComponent as internal object, and I the same result happened.

I don't what to have the initialization of the component outside. So, there any other alternative solution, or what am I doing wrong?.


Solution

  • You need to have the kapt processor in build.gradle:

    kapt {
        generateStubs = true
    }
    
    dependencies {
        ...
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        compile 'com.google.dagger:dagger:2.0.2'
        kapt 'com.google.dagger:dagger-compiler:2.0.2'
        ...
    }
    

    This extension will generate the code for dagger.

    Additionally, for newer gradle versions, you can also apply the plugin in your build.gradle:

    apply plugin: 'kotlin-kapt'
    
    dependencies {
        ...
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        compile 'com.google.dagger:dagger:2.0.2'
        kapt 'com.google.dagger:dagger-compiler:2.0.2'
        ...
    }
    

    You can check this project for reference