使用匕首柄传递拦截器以改造构建器

Jus*_*ing 1 android dependency-injection dagger-hilt

我正在学习改造拦截器,出于工作目的,我使用 dagger-hilt 将依赖项注入到片段等。我编写了一个自定义拦截器来检查连接错误,我试图将其添加到Retrofit.Builder()

    @Provides
    @Singleton
    fun provideApi(): StoreApi {
        return Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
            .build()
            .create(StoreApi::class.java)
    }
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何通过:

     val okHttpClient = OkHttpClient()
                .newBuilder()
                .addInterceptor(ConnectivityInterceptor)
                .build()
Run Code Online (Sandbox Code Playgroud)

作为改造构建器的 .client() (即使使用匕首柄),有什么想法吗?

Mar*_*een 6

您可以设置一个类似这样的模块,其中您将所有依赖项需求作为函数提供,并将它们暴露给 dagger,@Provides然后让 dagger 将依赖项提供为函数参数来构建依赖关系图:

@Module class ApiModule {

    @Provides
    @Singleton
    internal fun provideApi(retrofit: Retrofit): StoreApi {
        return retrofit
            .create(StoreApi::class.java)
    }

    @Provides
    @Singleton
    internal fun retrofit(client: OkHttpClient): Retrofit =
       Retrofit.Builder()
            .client(client)
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
            .build()

    @Provides
    @Singleton
    internal fun client(connectivityInterceptor: ConnectivityInterceptor): OkHttpClient =
        OkHttpClient.Builder()
            .addInterceptor(connectivityInterceptor)
            .build()

    @Provides
    @Singleton
    internal fun interceptor(): ConnectivityInterceptor = ConnectivityInterceptor()
}
Run Code Online (Sandbox Code Playgroud)

这是一个基于所提供代码的简单示例。