Dagger and Kotlin. Dagger doesn't generate com

2019-03-17 04:25发布

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

5条回答
Lonely孤独者°
2楼-- · 2019-03-17 04:50

UPDATE FOR KOTLIN 1.1.4

generateStubs does not work anymore. Feel free to make a build with the latest Kotlin and it would tell you in the Messages section of Android Studio that it is not necessary anymore. Here's an up-to-date list of dependencies for Dagger2 for Android and Kotlin

apply plugin: 'kotlin-kapt'

//...
// Other Gradle stuff
//...

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.4-3"

    compile 'com.google.dagger:dagger-android:2.12'
    kapt 'com.google.dagger:dagger-android-processor:2.12'
    compileOnly 'com.google.dagger:dagger:2.12'
    kapt 'com.google.dagger:dagger-compiler:2.12'
}
查看更多
三岁会撩人
3楼-- · 2019-03-17 04:55

If u have problem withe DaggerComponent, You should add

apply plugin: 'kotlin-kapt'

kapt {
    generateStubs = true
}

to build.gradleit will generate kotlin code for dagger 2 otherwise project will only build on Rebuild

查看更多
ゆ 、 Hurt°
4楼-- · 2019-03-17 05:01

This issue can be fixed with the bellow change which is different from original answer

Following will also work well to fix this issue

with plugins

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

and dependencies

implementation "com.google.dagger:dagger:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version" 
kapt "com.google.dagger:dagger-compiler:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"

For reference check out this Gist

查看更多
劳资没心,怎么记你
5楼-- · 2019-03-17 05:06

I don't know when this change happened, but on 1.1.2 of the Kotlin gradle plugin you replace this (in your module's build.gradle):

kapt {
    generateStubs = true
}

with this:

apply plugin: 'kotlin-kapt'

and then make sure to replace dependencies that use annotationProcessor with kapt.

For example, the old way would be to use:

annotationProcessor (
    'some.library:one:1.0'
    ...
    'some.library.n:n.0'
)

and now you use:

kapt (
    'some.library:one:1.0'
    ...
    'some.library.n:n.0'
)
查看更多
够拽才男人
6楼-- · 2019-03-17 05:15

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

查看更多
登录 后发表回答