首页 > 解决方案 > 覆盖 Dagger 模块中的依赖项

问题描述

有一个具有共同依赖关系的基本模块:

@Module
object CommonActivityModule {

    @JvmStatic
    @Provides
    fun baseNavigator(activity: AppCompatActivity): Navigator = BaseNavigator(activity, SOME_STUFF)

    // other common deps
}

我将它包含在每个 Activity 模块中以获取那些常见的 deps。但在某些模块中,我想用另一个实现一些基本接口实现:

@Module(includes = [CommonActivityModule::class])
interface SomeActivityModule {

    @Binds
    fun anotherNavigator(anotherNavigator: AnotherNavigator): Navigator    

    // other module's binds
}

它抛出..Navigator is bound multiple times异常。有没有办法可以在不放弃整个接口的情况下替换这些接口实现CommonActivityModule

标签: androidkotlindagger-2dagger

解决方案


您将每个绑定为导航器。我相信您需要在阴影绑定上使用不同的返回类型。

或者,您可以尝试使用限定符。定义自定义限定符很容易;你应该可以在网上找到例子。我会分享一个,但我现在在我的手机上。

此答案已被接受,因此我想添加一些代码以使其更加“完整”。这是自定义“限定符”(Kotlin)的示例

import javax.inject.Qualifier

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class DelayQualifier

用法:

@Module object {
    @Provides @DelayQualifier @JvmStatic
    fun provideDelay(): Long = if (BuildConfig.DEBUG) 1L else 3L
}

@ActivityScoped
class SignupViewModelFactory @Inject constructor(
    @param:DelayQualifier private val delay: Long
) : ViewModelProvider.Factory { ... }

这是Long我目前在我的项目中注入的唯一一个,所以我不需要限定符。但是如果我决定我想要更多Long的s,我会后悔没有资格这个。


推荐阅读