47

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

Jake Lee
  • 7,549
  • 8
  • 45
  • 86
Leo
  • 605
  • 1
  • 6
  • 10
  • 3
    did you have `kapt 'com.google.dagger:dagger-compiler:2.0.2'` in build.gradle? – Deividi Cavarzan Dec 20 '15 at 00:20
  • 2
    Follwing will also works 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"` – Devishankar Dec 13 '17 at 15:23

10 Answers10

105

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

Deividi Cavarzan
  • 10,034
  • 13
  • 66
  • 80
  • where'd you learn about the "generateStubs" configuration? i was missing this bit and luckily stumbled across this answer. – homerman Aug 13 '16 at 14:03
  • Did the sequence of items in `dependencies` count? First it didn't work for me because `compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"` were added to the end of dependencies list. Then I move it to top and it worked. – JuniperPhoton Jun 13 '17 at 03:30
  • Follwing will also works 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"` – Devishankar Dec 13 '17 at 15:20
  • If it is java based android project, what we should give in gradle file? – Ashok Reddy Narra Mar 21 '19 at 11:16
22

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'
)
Plumbus
  • 397
  • 3
  • 7
14

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'
}
solidak
  • 5,033
  • 3
  • 31
  • 33
7

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

Devishankar
  • 194
  • 2
  • 16
1

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"
Minion
  • 964
  • 14
  • 16
  • It works but, i don't understand. Why we have to implement both dagger and dagger android? At the documentation it says implement only dagger-android. – Talha Ç Dec 31 '22 at 08:26
0

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!

Maragues
  • 37,861
  • 14
  • 95
  • 96
0

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.

Maria
  • 199
  • 3
  • 15
0

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.

0

If all of the aforementioned solutions doesn't work and you can't still see any generated DaggerComponent:

Sometime the issue is deceptive. It comes from Android Studio that generates the sources as expected in the build folder but doesn't refresh this folder, your sources does what has changed in the build folder.

You'll have to manually force Android Studio to reload the sources from Disk . You can achieve that by finding the appropriate action or right clicking on the incriminated module.

enter image description here

enter image description here

SebVay
  • 141
  • 1
  • 5
-1

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

Minis
  • 463
  • 3
  • 10