我有两个Dagger 2模块:
NetworkModule
,范围为@Singleton
,提供HTTP客户端; ApiModule
,具有自定义@UserScope
范围,使用HTTP客户端为Github的API创建使用者。然后,我创建了一个Dagger 2组件,以提供Retrofit客户端。
@Module
class NetworkModule {
@Provides
@Singleton
fun provideHttpClient(): OkHttpClient = OkHttpClient.Builder().build()
}
@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)
}
@Component(modules = [ApiModule::class])
@UserScope
interface ApiComponent {
fun inject(target: GithubRetriever)
}
当我尝试构建应用程序时,如果我将@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
才能成功构建?
答案 0 :(得分:2)
单个模块不能引用两个范围;当您在NetworkModule
(ApiModule
)中加入@Module(includes = [NetworkModule::class])
时,会发生什么。
但是,模块可以依赖在使用不同范围的组件上。
@Component(modules = [NetworkModule::class])
@Singleton
interface NetworkComponent
@Component(dependencies = [NetworkComponent::class], modules = [ApiModule::class])
interface ApiComponent {
fun inject(target: GithubRetriever)
}