当前位置: 首页 > 知识库问答 >
问题:

使用@binds和@inject字段进行Dagger2依赖项循环

符渊
2023-03-14

每当我尝试使用带有绑定对象的子组件时,我就会得到一个依赖循环。我有一个应用程序范围和一个活动范围。在app范围内,我创建我的web服务,然后当活动打开时,我要创建一个存储对象、控制器和导航器(所有自定义类,而不是androidx类),并将它们注入到我的androidx ViewModel类中。但当我这样做时,我会得到一个依赖循环。

我的顶级组件看起来像

@AppScope
@Component(modules = [AppModule::class])
interface AppComponent {

  val activityComponentBuilder: ActivityComponent.Builder
}

@Module(subcomponents = [ActivityComponent::class])
interface AppModule {

  @Binds
  fun mockWebService(mockWebService: MockWebService): MockWebService
}

接下来,我的子组件看起来像

@ActivityComponent
@Subcomponent(modules = [ActivityModule::class])
interface ActivityComponent {

  fun inject(sharedViewModel: SharedViewModel)

  @Subcomponent.Builder
  interface Builder {
    @BindsInstance
    fun storage(storage: Storage): Builder

    fun build(): ActivityComponent
  }
}
  @Binds
  abstract fun controller(controller: Controller): Controller

  @Binds
  abstract fun navigator(navigator: Navigator): Navigator
class Navigator @Inject constructor(private val storage: Storage)

class Controller @Inject constructor(
  private val webService: MockWebService,
  private val navigator: Navigator,
  private val storage: Storage
) {
  @Inject
  lateinit var navigator: Navigator
  @Inject
  lateinit var controller: Controller

  init {
      MainApplication.component.activityComponentBuilder
        .storage(InMemoryStorage.from(UUID.randomUUID().toString()))
        .build()
        .inject(this)

  }
[Dagger/DependencyCycle] Found a dependency cycle: public abstract interface AppComponent {

MockWebService is injected at di.AppModule.mockWebService(mockWebService)
MockWebService is injected at ActivityModule.Controller(webService, …)
Controller is injected at SharedViewModel.controller
SharedViewModel is injected at

但错误消息在那里截断了。我是不是在如何使用子组件将对象放到图上,然后将它们注入到一个对象中时遗漏了什么?这用匕首不行吗?

共有1个答案

罗波鸿
2023-03-14

@binds用于让dagger了解接口的不同实现。这里不需要@binds,因为Navigator和Controller是不实现任何接口的普通类。我认为MockWebService也是这种情况。而且,这些类有@inject constructor,这意味着dagger可以实例化它们,我们不需要为这些类编写额外的@provide函数。

@binds没有执行任何作用域。它唯一的工作就是告诉dagger不同的实现方式。可以将@xscope@binds一起添加,使某些对象具有作用域。或者,您可以将作用域注释添加到类声明中。下面是一个如何向类声明添加作用域的示例。

至于依赖循环,我认为这是因为您告诉activitycomponent使用activitymodule并告诉activitymodule安装activitycomponent。只做其中一个应该是这样的(我认为)。

 类似资料:
  • 我得到以下生成错误: 错误:[dagger.android.androidinjector.inject(T)]没有@provides-annotated方法,无法提供android.support.v4.app.fragmentManager。 公共抽象接口AppComponent扩展dagger.android.androidinjector{^android.support.v4.app.f

  • 在阅读dagger 2的文档时,我找不到一种简单的方法来在构建测试应用时提供依赖项。我找到的唯一线索是: 匕首2不支持覆盖。覆盖简单测试假货的模块可以创建模块的子类来模拟该行为。应该分解使用覆盖并依赖依赖依赖项注入的模块,以便将被覆盖的模块表示为两个模块之间的选择。 我不明白我将如何在Android上设置这样的配置,任何人都可以解释吗?

  • 问题内容: 我在Android应用程序中将Dagger2用于DI。我发现我必须为使用@Inject字段的每个类编写注入方法。有没有一种方法可以只注入父类,而不必在每个子类上调用inject?以活动为例。我有一个“ 每个活动都从中延伸”的内容。有没有一种方法,我可以在BaseActivity的组件中创建一个注入方法,然后在BaseActivity的onCreate中调用inject,子活动中的@in

  • 问题内容: 这是我目前拥有的并且可以正常工作: 现在,我想添加另一个依赖项。我将其更改为: 但是现在我收到此错误消息: FragmentFacebookLoginComponent依赖于多个作用域组件 我该如何解决?我如何有多个依赖关系? 如果我从一个组件中删除范围,则会收到此错误消息: AnotherComponent(无作用域)不能依赖范围内的组件 问题答案: 最后,我创建了一个具有正确范围的

  • 使用 @Inject 注解可以向 Controller 以及 Interceptor 中注入依赖对象,使用注入功能需要如下配置: public void configConstant(Constants me) { // 开启对 jfinal web 项目组件 Controller、Interceptor、Validator 的注入 me.setInjectDependency(t

  • 例如,Foos的资源可能如下所示: 对于酒吧: