1

I'm using the Dagger2 AndroidInjector and Kotlin. I have a subcomponent with its module defined in this way:

@Subcomponent(modules = arrayOf(
        UIModule::class,
        HomeActivitySubcomponent.ComponentModule::class
))
interface HomeActivitySubcomponent : AndroidInjector<HomeActivity> {
    @Subcomponent.Builder
    abstract class Builder : AndroidInjector.Builder<HomeActivity>()

    @Module
    abstract class ComponentModule {
        @Binds
        @IntoMap
        @ActivityKey(HomeActivity::class)
        internal abstract fun bindMainActivityInjectorFactory(builder: Builder): AndroidInjector.Factory<out Activity>
    }
}

If this was java I could add a static @Provides method to the ComponentModule @Module. It has to be static because Dagger complains if I add a non-static method to an @Module class that uses @Binds:

Error:A @Module may not contain both non-static @Provides methods and abstract @Binds or @Multibinds declarations

The problem is: how can I do this with Kotlin?

Rishabh Maurya
  • 1,448
  • 3
  • 22
  • 40
kingston
  • 11,053
  • 14
  • 62
  • 116

1 Answers1

0

I ended with this:

@Subcomponent(modules = arrayOf(
        UIModule::class,
        HomeActivitySubcomponent.ComponentModuleForProviders::class,
        HomeActivitySubcomponent.ComponentModule::class
))
interface HomeActivitySubcomponent : AndroidInjector<HomeActivity> {
    @Subcomponent.Builder
    abstract class Builder : AndroidInjector.Builder<HomeActivity>()

    @Module
    abstract class ComponentModule {
        @Suppress("unused")
        @Binds
        @IntoMap
        @ActivityKey(HomeActivity::class)
        internal abstract fun bindMainActivityInjectorFactory(builder: Builder): AndroidInjector.Factory<out Activity>
    }

    @Module
    open class ComponentModuleForProviders {
        @Provides
        open fun provideDrawerPresenter(): DrawerPresenter {...}
     }

}

So I use a second @Module class for the @Provides methods: ComponentModuleForProviders.

kingston
  • 11,053
  • 14
  • 62
  • 116