使用 AndroidInjector 和 Kotlin 在 SubComponent 中提供方法

@Provides methods in SubComponent with AndroidInjector and Kotlin

我正在使用 Dagger2 AndroidInjector 和 Kotlin。我有一个子组件,它的模块是这样定义的:

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

如果这是 java 我可以向 ComponentModule @Module 添加静态 @Provides 方法。它必须是静态的,因为如果我向使用 @Binds:

的 @Module class 添加非静态方法,Dagger 会抱怨

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

问题是:我如何使用 Kotlin 做到这一点?

我这样结束:

@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 {...}
     }

}

所以我为@Provides 方法使用了第二个@Module class:ComponentModuleForProviders.