Android 匕首绑定多次:试图创建一个伪实现

Android 匕首绑定多次:试图创建一个伪实现,android,kotlin,dagger-2,dagger,Android,Kotlin,Dagger 2,Dagger,大家好,我正在尝试为我的活动创建一个假演示者我有我的模块,我们称之为Activity1模块,我在其中设置了所有演示者、用例、所有内容,它工作得非常完美,但当尝试创建一个屏幕,其中使用了一个假演示者的确切活动时,它表示我已绑定该演示者多次 我所做的是: @Module abstract class Activity1Module{ @Binds abstract fun providePresenter(impl: PresenterImpl) : Activity1Contract.Pr

大家好,我正在尝试为我的活动创建一个假演示者我有我的模块,我们称之为Activity1模块,我在其中设置了所有演示者、用例、所有内容,它工作得非常完美,但当尝试创建一个屏幕,其中使用了一个假演示者的确切活动时,它表示我已绑定该演示者多次

我所做的是:

@Module
abstract class Activity1Module{
  @Binds
  abstract fun providePresenter(impl: PresenterImpl) : Activity1Contract.Presenter
  .....
}
然后我创建了一个新模块FakeActivity1模块,如下所示:

@Module(includes = [Activity1Module::class])
abstract class FakeActivity1Module {
   
   @Binds
   abstract fun bindsFakePresenter(impl: FakePresenterImpl): Activity1Contract.Presenter
   .....
}

但是看起来它不像这样,有没有办法在不创建
@Named
或触摸生产代码的情况下使用假模块而不是生产模块?

Dagger没有任何能力让一个模块直接覆盖另一个模块的绑定。FakeActivity1Module和Activity1Module应该包含类似的绑定,但两者都不应该在另一个的
包含列表中

但是,您可以将公共绑定提取到Activity1CommonModule(根据需要命名),并使Activity1Module和FakeActivity1Module都包含该模块。这将允许您尽可能避免重复自己的操作,而在概念上是以文件之间的一些间接操作为代价的


您甚至可以将Activity1CommonModule作为嵌套接口(或抽象或静态类)包含在Activity1Module中;您仍然需要Activity1Module的
包含
来包含自己的
Activity1Module.Activity1Commodule.class
,但这样做的好处是可以将所有Activity1Module的绑定集中在一个文件中,还可以很容易地看穿差异(git diff、p4 diff等)当绑定移入或移出公共集时。

同一类不能被注入2次,并且会产生多次绑定的
错误。因此,对于
FakeActivity1Module
,而不是创建新的注入。尝试覆盖
活动1模块
并应用更改

class FakeActivity1Module:  Activity1Module {

   overrides fun providePresenter(): Activity1Contract.Presenter = FakePresenterImpl()
}
您可以在组件中使用
FakeActivity1Module
进行测试,它应该可以按预期工作