具有不同范围模块的 Dagger 2 组件

2024-02-29

Context

我有两个 Dagger 2 模块:

  1. NetworkModule, with @Singleton范围,提供 HTTP 客户端;
  2. ApiModule,有一个自定义的@UserScope作用域,它使用 HTTP 客户端为 Github 的 API 创建使用者。

然后,我创建一个 Dagger 2 组件,以提供 Retrofit 客户端。

网络模块.kt

@Module
class NetworkModule {
    @Provides
    @Singleton
    fun provideHttpClient(): OkHttpClient = OkHttpClient.Builder().build()
}

ApiModule.kt

@Module(includes = [NetworkModule::class])
class ApiModule(private val user: String) {

    @Provides
    @UserScope
    fun provideApi(httpClient: OkHttpClient): GithubApi = Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .client(httpClient)
            .build()
            .create(GithubApi::class.java)
}

ApiComponent.kt

@Component(modules = [ApiModule::class])
@UserScope
interface ApiComponent {
    fun inject(target: GithubRetriever)
}

Issue

当我尝试构建应用程序时,如果我添加@UserScope范围至ApiComponent然后我收到以下错误消息:

e: ApiComponent.java:4: error: ApiComponent scoped with @UserScope may not reference bindings with different scopes:
e: 
e: @dagger.Component(modules = {ApiModule.class})
e: ^
e:       @org.jetbrains.annotations.NotNull @Singleton @Provides okhttp3.OkHttpClient NetworkModule.provideHttpClient()

如果我使用也会发生同样的情况@Singleton范围而不是@UserScope.

我该如何申报ApiComponent为了成功构建?


单个模块不能引用两个作用域;这就是当你包括以下内容时发生的情况NetworkModule in the ApiModule (@Module(includes = [NetworkModule::class])).

然而,一个模块可以depend在使用不同作用域的组件上。

@Component(modules = [NetworkModule::class])
@Singleton
interface NetworkComponent

@Component(dependencies = [NetworkComponent::class], modules = [ApiModule::class])
interface ApiComponent {
    fun inject(target: GithubRetriever)        
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有不同范围模块的 Dagger 2 组件 的相关文章

随机推荐