有一个具有共同依赖关系的基本模块:
@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
的情况下替换这些接口实现?
答案 0 :(得分:1)
您将每个绑定为导航器。我相信你需要在你的阴影绑定上使用不同的返回类型。
或者,您可以尝试使用限定符。定义自定义限定符很容易;你应该能够在网上找到例子。我分享了一个,但我现在在手机上。
此答案已被接受,因此我想添加一些代码以使其更加完整"。以下是定制"限定符"的示例。 (科特林)
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,我很遗憾不会对此进行排位。