首页 > 解决方案 > 匕首绑定多次:试图创建一个假的实现

问题描述

嗨,我正在尝试为我的活动创建一个假演示者我有我的模块让我们称之为 Activity1module 我已经设置了所有演示者、用例、所有内容,并且它运行良好,但是当尝试创建一个使用它的屏幕时与假演示者的确切活动它说我已经绑定了多次该演示者。

我所做的是:

@Module
abstract class Activity1Module{
  @Binds
  abstract fun providePresenter(impl: PresenterImpl) : Activity1Contract.Presenter
  .....
}

然后我创建了一个新模块 FakeActivity1Module ,它是这样的:

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

但看起来它不喜欢这种方式,有没有办法在不创建@Named或接触生产代码的情况下使用假的而不是生产的?

标签: androidkotlindagger-2dagger

解决方案


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

但是,您可以提取到 Activity1CommonModule(根据您的喜好命名)的通用绑定,并让 Activity1Module 和 FakeActivity1Module 都包含该模块。这将允许您尽可能避免重复自己,但以文件之间的某些间接概念为代价。

您甚至可以将 Activity1CommonModule 作为嵌套接口(或抽象或静态类)包含在 Activity1Module 中;你仍然需要 Activity1Moduleincludes来包含它自己的 Activity1Module Activity1Module.Activity1CommonModule.class,但是你可以将所有 Activity1Module 的绑定集中在一个文件中,并且可以在绑定移动时轻松查看差异(git diff、p4 diff 等)在或不在公共集合中。


推荐阅读