Search code examples
androidkotlindagger-2androidinjector

@Provides methods in SubComponent with AndroidInjector and Kotlin


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?


Solution

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