android - 覆盖 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
?
解决方案
您将每个绑定为导航器。我相信您需要在阴影绑定上使用不同的返回类型。
或者,您可以尝试使用限定符。定义自定义限定符很容易;你应该可以在网上找到例子。我会分享一个,但我现在在我的手机上。
此答案已被接受,因此我想添加一些代码以使其更加“完整”。这是自定义“限定符”(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,我会后悔没有资格这个。
推荐阅读
- oauth-2.0 - 对于非本机模式下的 Yammer 网络,我们是否需要过渡到将 MSAL 与 Yammer 组 API 终结点一起使用?
- python - 如何为 Turtle tkinter 制作重启按钮?(乌龟,Tkinter,希尔伯特曲线)
- php - Wordpress 自定义简码输出内容的开始
- django - 带有 aiohttp 客户端的异步 Django 3.1
- java - Maven 资源路径
- reactjs - 使用带有 grahql 的 AWS 放大创建新用户时出现“未经授权”错误
- mapbox - 某些地区的 MapBox 数据质量问题
- angular - NGRX 使用 CombineLatest 防止无限循环
- javascript - 如何在没有任何新依赖项的情况下在 React JS 中使用此 CSS 代码?
- angular - 角度将属性总和绑定到属性