Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin中Dagger中带注释绑定之间的依赖循环_Kotlin_Annotations_Cycle_Dagger - Fatal编程技术网

Kotlin中Dagger中带注释绑定之间的依赖循环

Kotlin中Dagger中带注释绑定之间的依赖循环,kotlin,annotations,cycle,dagger,Kotlin,Annotations,Cycle,Dagger,上下文 我有一个使用Dagger(2.27版)用Kotlin编写的Android应用程序。在我的测试中,我创建了一些依赖项的真实实例,其中一些依赖项@InjectaCoroutineDispatcher @Singleton @Component(modules = [RepositoryTestModule::class]) interface TestComponent { fun inject(...) @Component.Factory interface F

上下文

我有一个使用Dagger(2.27版)用Kotlin编写的Android应用程序。在我的测试中,我创建了一些依赖项的真实实例,其中一些依赖项
@Inject
a
CoroutineDispatcher

@Singleton
@Component(modules = [RepositoryTestModule::class])
interface TestComponent {
    fun inject(...)

    @Component.Factory
    interface Factory {
        fun create(
            @BindsInstance @TestIODispatcher ioDispatcher: CoroutineDispatcher) : TestComponent
    }
}
目标

允许我的测试选择性地指定Dagger的测试组件使用的测试
CoroutineDispatcher
。有些测试不需要额外的配置,它们应该自动获得预定义的测试调度程序

如何

我有一个模块,它为
@TestIODispatcher-CoroutineDispatcher
公开
@BindsOptionalOf

  • 当测试需要自定义调度程序时,它可以在TestComponent的工厂内手动绑定它
  • 当测试不需要任何自定义调度程序时,它应该自动获取TestCoroutineDispatcher()
在组件定义期间,我作为工厂的参数通过了自定义的仅测试调度器

DaggerAppNameViewModelTest_TestComponent
  .factory()
  .create(Dispatchers.IO)
问题

我的测试编译失败,出现[Dagger/DependencyCycle]错误

public static abstract interface TestComponent {
                           ^
  java.util.Optional<kotlinx.coroutines.CoroutineDispatcher> is injected at
      com.example.<appname>.repository.RepositoryTestModule.Companion.coroutineDispatcher(testIODispatcher)
  kotlinx.coroutines.CoroutineDispatcher is injected at
  ...  
公共静态抽象接口TestComponent{ ^ java.util.Optional在 com.example..repository.RepositoryTestModule.Companion.coroutineDispatcher(testIODispatcher) kotlinx.coroutines.CoroutineDispatcher在 ... 我没有看到依赖循环,因为我的
@IODispatcher-CoroutineDispatcher
依赖于
@TestIODispatcher-CoroutineDispatcher
,它被测试显式绑定

我的理论是Kotlin以某种方式去掉注释,然后通过类型比较绑定。在这种情况下,确实会有一个循环

我是否错过了一个明显的循环,或者我需要对注释做些什么

public static abstract interface TestComponent {
                           ^
  java.util.Optional<kotlinx.coroutines.CoroutineDispatcher> is injected at
      com.example.<appname>.repository.RepositoryTestModule.Companion.coroutineDispatcher(testIODispatcher)
  kotlinx.coroutines.CoroutineDispatcher is injected at
  ...