如何在 Hilt dagger 中重新初始化单例组件?

尼蒂什

我的项目中有一个改造模块,登录前我想使用没有标题的改造,但登录后我想使用带头的改造使用 Hilt Dagger。我怎样才能做到这一点?

@Module
@InstallIn(SingletonComponent::class)
object RetrofitDi {


@Provides
fun getBasePath(): String {
    return "http://abcd.com/"
}

@Provides
fun providesLoggingInterceptor(): HttpLoggingInterceptor {

    return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
}

@Provides
fun providesOkHttpClients(@ApplicationContext context: Context, sharedPreference: SharedPreference, httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
    val okhttpClient = OkHttpClient.Builder()
    okhttpClient.addInterceptor(httpLoggingInterceptor)
    okhttpClient.callTimeout(60, TimeUnit.SECONDS)
    okhttpClient.connectTimeout(60, TimeUnit.SECONDS)
    okhttpClient.writeTimeout(60, TimeUnit.SECONDS)
    okhttpClient.readTimeout(60, TimeUnit.SECONDS)
    val token = sharedPreference.getStringData(SharedPreference.AUTH_KEY)
    val user_id = sharedPreference.getStringData(SharedPreference.USER_ID)
    if (BuildConfig.DEBUG) {
        val interceptor = HttpLoggingInterceptor()
        interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS)
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        okhttpClient.addInterceptor(interceptor)
        okhttpClient.addInterceptor(Interceptor { chain ->
            val response = chain.proceed(chain.request())
            if (!response.isSuccessful) {
                when (response.code) {
                    CommonUtils.ALREADY_LOGGED_IN -> {
                        
                        sharedPreference.setBoolean(SharedPreference.IS_LOGGED_IN, false)
                        sharedPreference.clear()
                        context.getCacheDir().delete()
                        val intent = Intent(context, LoginActivity::class.java)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
                        context.startActivity(intent)
                    }
                }
            }
            response
        })
    }

    okhttpClient.addInterceptor(Interceptor { chain: Interceptor.Chain ->
        val builder1 = chain.request().newBuilder()
        var request: Request? = null
        if (!token.isEmpty()) {
            builder1.addHeader("auth_key", "" + token)
        }
        if (!user_id.isEmpty()) {
            builder1.addHeader("user_id", "" + user_id)
        }
        request = builder1.build()
        chain.proceed(request)
    })
    return okhttpClient.build()
}

@Provides
fun providesGSONConvertorFactory(): Converter.Factory {

    return GsonConverterFactory.create()
}

@Provides
fun providesRetrofit(baseUrl: String, convertor: Converter.Factory, okHttpClient: OkHttpClient): Retrofit {
    return Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(convertor).client(okHttpClient).build()
}


@Provides
fun providesApiService(retrofit: Retrofit): ApiService {
    return retrofit.create(ApiService::class.java)
}
}

单例实例在 hilt-dagger 中创建一次,但登录后令牌和 user_id 将可用。登录后,我将需要新的 okhttpclient。我在没有 DI 的情况下做到了。但不知道如何处理hilt-dagger。

阿南德

更好的方法是为@Headers("Token-required")需要令牌的 API注释您的 API 服务方法然后在您的拦截器方法中检查此标头为:

if (request.header("Token-required") != null) {
        request = request.newBuilder()
            .addHeader("token", "your token value")
            .build()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Dagger Hilt在动态要素模块中创建ViewModel?

android - hilt - 如何在初始化後更新值

Dagger Hilt“辅助”和“ ViewModelInject”已弃用。在Dagger Hilt视图模型1.0.0-alpha03中

不推荐使用 Dagger Hilt @ViewModelInject 如何在 @HiltViewModel 中使用 @ApplicationContext

Dagger Hilt 错误注入 ActivityContext

如何使单例重新初始化变量?

Angular如何重新初始化单例服务

在使用标志-Adagger.hilt.disableModulesHaveInstallInCheck = true从Dagger迁移到Hilt的过程中,抑制@InstallIn检查时出错

Gregory Kick了解dagger2 ScopedProvider中的惰性初始化单例

如何在 Application 类中访问 Hilt 模块

Dagger:如何检查 dagger.Lazy 变量是否已初始化

在测试用例中如何在RobotFramework中重新初始化变量值

Dagger-Hilt:@ViewModelInject没有注入MyViewModel并崩溃?

Android Hilt dagger 在 viewModel @ViewModelInject 中注入接口得到 UninitializedPropertyAccessException

无法使用Dagger Hilt`@ WorkerInject`注入Android WorkManager Worker

带有泛型的 Dagger Hilt 缺失/绑定接口

在存储库类中使用dagger-hilt

我收到“循环依赖”Android Dagger Hilt 错误

使用 Hilt/Dagger2 注入密封类

如何在 vueJS 中重新初始化 v-for 组件

Dagger 中的单例方法

如何在活动之间共享Dagger2子组件

如何在Play中初始化急切的单例而无需控制器请求?

.Net Core:如何初始化需要DBContext的单例?

初始化前如何更改单例模式

Hilt中的组件依赖关系

如何在Dagger2中提供视图?

Dagger 2,如何在依赖项中添加接口

如何在 SwiftUI NavigationView 中重新初始化类