gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:42 26 4
gpt4 key购买 nike

上下文

我有两个 Dagger 2 模块:

  1. NetworkModule,具有 @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)
}

Api组件.kt

@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 才能成功构建?

最佳答案

单个模块不能引用两个作用域;这就是当您将 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)
}

关于java - 具有不同范围模块的 Dagger 2 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48078519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com