Leo
Leo

Reputation: 655

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

Upvotes: 49

Views: 23556

Answers (9)

YashInvinz
YashInvinz

Reputation: 1

For anyone still looking for an answer in 2023, You just need the following dependencies:

 plugins {
       id 'com.android.application'
       id 'org.jetbrains.kotlin.android'
       id 'kotlin-kapt'
       }

dependencies {
    def dagger_version = "2.44" //or any latest versions
    implementation 'com.google.dagger:dagger:$dagger_version"'
    kapt 'com.google.dagger:dagger-compiler:$dagger_version"'
    }

And you need to be looking for the generated components in the package with the name

"com.yourcompanyname.yourprojectname(debug)"

inside java package.

You won't find the generated dagger files in the java(generated) package.

After adding all the dependencies try clean, rebuild and then run the project and you should be seeing the generated files.

Upvotes: 0

Minion
Minion

Reputation: 1064

Use these dependencies if you are using kotlin as the primary language for android application development

// Dagger dependencies
def dagger_version = "2.44"
implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version" // if you use the support libraries
kapt "com.google.dagger:dagger-android-processor:$dagger_version"

Upvotes: 1

Maria
Maria

Reputation: 199

Sorry, I didn’t create a new issue, but decided to answer under similar questions, because maybe someone find it useful!

I faced to ridiculous issue! «Make Project» do not generate dagger files. They are generated while preparing run your App! But I was trying to solve problem for hours and didn't think of simple trying to click Run..)))

So, maybe you faced to the same problem: Neither «Sync Project with Gradle» nor «Clean» and «Build Project» help generate dagger files.

-> Then just Run your App!

After the first Run App my Dagger started generated files if I click Make Project.

Upvotes: 0

Maragues
Maragues

Reputation: 38324

My case must be some exclusion rule in Dagger's implementation

com.mycompany.native -> Dagger doesn't generate code

com.mycompany.other -> Dagger generates code

I wasted quite some time on this :-( I hope it helps someone else!

Upvotes: 0

Deividi Cavarzan
Deividi Cavarzan

Reputation: 10110

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

Upvotes: 105

Devishankar
Devishankar

Reputation: 229

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

Upvotes: 7

Plumbus
Plumbus

Reputation: 397

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'
)

Upvotes: 22

solidak
solidak

Reputation: 5081

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'
}

Upvotes: 14

Minis
Minis

Reputation: 462

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

Upvotes: -1

Related Questions