https://kotlinlang.org logo
Title
a

alouanemed

08/15/2017, 10:19 AM
Hey, just converted java class to kotlin and After adding kapt to my gradle , the dagger component is not generated any more, anyone here can help?
apply plugin: 'kotlin-kapt'
...
implementation 'com.google.dagger:dagger:2.11'
kapt 'com.google.dagger:dagger-compiler:2.11'
g

gildor

08/15/2017, 10:19 AM
Do you have any build errors?
e

efemoney

08/15/2017, 10:20 AM
Have you tried to
./gradlew clean
and/or rebuild project?
d

denis.shakinov

08/15/2017, 10:20 AM
Did you add
kapt {
    generateStubs = true
}
to gradle file?
😞 1
👎 3
a

alouanemed

08/15/2017, 10:21 AM
WelcomeContract.Presenter> cannot be provided without an @Provides- or @Produces-annotated method
g

gildor

08/15/2017, 10:21 AM
You don’t need generateStubs = true
a

alouanemed

08/15/2017, 10:21 AM
yeah, i don't have it .
@efemoney yeah done all that.
@Module class WelcomeModule { @Provides fun providePresenterFactory(interactor: DragonInteractor): () -> WelcomePresenter { return { WelcomePresenter(interactor) } } }
e

efemoney

08/15/2017, 10:22 AM
Where is your @Provides method for WelcomeContract.Presenter ?
g

gildor

08/15/2017, 10:22 AM
But this function returns lambda instead instance of class
e

efemoney

08/15/2017, 10:22 AM
Exactly
a

alouanemed

08/15/2017, 10:23 AM
aha?
d

denis.shakinov

08/15/2017, 10:23 AM
@gildor from which version of kotlin plugin?
a

alouanemed

08/15/2017, 10:23 AM
what's the correct syntax ?
g

gildor

08/15/2017, 10:23 AM
@Provides fun providePresenterFactory(interactor: DragonInteractor): WelcomePresenter {
        return WelcomePresenter(interactor) 
}
e

efemoney

08/15/2017, 10:23 AM
☝️
a

alouanemed

08/15/2017, 10:23 AM
hah ! convert failed !
g

gildor

08/15/2017, 10:24 AM
could you please show your original java code?
e

efemoney

08/15/2017, 10:24 AM
Yeah you should probably report that on YT. If it was the converter that did that
a

alouanemed

08/15/2017, 10:24 AM
YT ?
g

gildor

08/15/2017, 10:25 AM
YouTrack
e

efemoney

08/15/2017, 10:25 AM
YouTrack
👍 1
g

gildor

08/15/2017, 10:25 AM
Please show original code before you filled issue
@denis.shakinov Not sure, but it been there even before 1.1. For now you should use only kapt3. kapt1 has a lot of problems and known bugs and not supported anymore. You need only kotlin-kapt plugin
l

lovis

08/15/2017, 10:27 AM
exactly what Andrey says. kapt3 only and therefore no
generateStubs
a

alouanemed

08/15/2017, 10:28 AM
The lambda is already there 😕
g

gildor

08/15/2017, 10:29 AM
I see, you original code returns PresenterFactory, that, as I suppose is SAM interface.
It’s not a fail of conversion, but yeah, this conversion doesn’t work properly with Dagger
@Provides fun providePresenterFactory(interactor: DragonInteractor): PresenterFactory<WelcomeContract.Presenter> {
        return PresenterFactory { WelcomePresenter(interactor) }
    }
}
@alouanemed Try this
d

denis.shakinov

08/15/2017, 10:36 AM
@gildor so using kotlin plugin 1.1.4 and having kotlin-kapt in my gradle file means that I’m already using kapt3 and i can delete generateStubs everywhere?
g

gildor

08/15/2017, 10:39 AM
@denis.shakinov yes
d

denis.shakinov

08/15/2017, 10:39 AM
thank you
a

alouanemed

08/15/2017, 10:41 AM
it says PresenterFactory ;Interface doesn't have constructor
g

gildor

08/15/2017, 10:44 AM
@alouanemed PresenterFactory is Kotlin or Jva interface?
a

alouanemed

08/15/2017, 10:45 AM
kotlin
interface PresenterFactory<T : BasePresenter<*>> { fun create(): T }
g

gildor

08/15/2017, 10:45 AM
Oh, in this case you cannot use SAM conversion
a

alouanemed

08/15/2017, 10:45 AM
why is that?
g

gildor

08/15/2017, 10:45 AM
@alouanemed then you need to implement this interface:
@Provides
fun providePresenterFactory(interactor: DragonInteractor): PresenterFactory<WelcomeContract.Presenter> {
    return object : PresenterFactory<WelcomeContract.Presenter> {
        override fun provide(): WelcomeContract.Presenter {
            return WelcomePresenter(interactor)
        }
    }
}
a

alouanemed

08/15/2017, 10:48 AM
I see, what if I revoked back the Factory interface to java?
the old verison should work, right ?
g

gildor

08/15/2017, 10:53 AM
@alouanemed Yeah this should work - https://kotlinlang.slack.com/archives/C0B8M7BUY/p1502793037000209?thread_ts=1502792341.000112&amp;cid=C0B8M7BUY But I think there are 3 better options: 1) Implement interface as anonymous object, looks not so good, but works - https://kotlinlang.slack.com/archives/C0B8M7BUY/p1502793957000002?thread_ts=1502792341.000112&amp;cid=C0B8M7BUY 2) Write some simple wrapper for PresenterFactory to hold lambda 3) Use qulifier annotation on lamda, it will allow you to use lambda directly, but require refactor all client usages
for option 2:
class SimplePresenterFactory<T : BasePresenter<*>>(private val factory: () -> T) : PresenterFactory<T> {
    override fun create(): T {
        return factory()
    }
}
and then to use it:
@Provides
fun providePresenterFactory(interactor: DragonInteractor): PresenterFactory<WelcomeContract.Presenter> {
    return SimplePresenterFactory { WelcomePresenter(interactor) }
}
a

alouanemed

08/15/2017, 11:02 AM
Thank you for the detailed answer. I opt ed for the first one (converting Factory to java) that one is fixed, but am getting this bunch of errors in all my sub components : Component.java5️⃣ error: incompatible types: NonExistentClass cannot be converted to Annotation e: e: @error.NonExistentClass() e: ^
@ActivityScope @Subcomponent(modules = arrayOf(WelcomeModule::class)) interface WelcomeComponent {
g

gildor

08/16/2017, 1:11 AM
Try to clean your project and build again
If you still has this problem after clean it means that you have some other problem and should check gradle build logs, reason is definitely there
👌 1