【问题标题】:How can i reinitialise the Singleton Component in Hilt dagger?如何重新初始化 Hilt dagger 中的 Singleton 组件?
【发布时间】:2021-09-18 22:09:10
【问题描述】:

我的项目中有一个改造模块,在登录之前我想使用不带标题的改造,但登录后我想使用 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 中创建了一次单例实例,但 token 和 user_id 将在登录后可用。登录后我需要新的 okhttpclient。我在没有 DI 的情况下做到了。但是不知道怎么处理hilt-dagger。

【问题讨论】:

  • 您应该为此使用 OkHttp 拦截器。添加一个拦截器,检查用户是否登录,如果是,请添加您需要的标题square.github.io/okhttp/interceptors/#rewriting-requests
  • 或者查看这个答案:stackoverflow.com/a/41082979/2910520
  • 谢谢@MatPag 我更新了我的问题。我知道如何在没有 DI 的情况下做到这一点,但在 Hilt-dagger 中我正在苦苦挣扎。
  • 我认为你的代码很好(你可以稍微清理一下),只需将 val token = sharedPreference.getStringData(SharedPreference.AUTH_KEY) val user_id = sharedPreference.getStringData(SharedPreference.USER_ID) 移动到第二个拦截器块中,否则它们将不会被再次评估,因为它们是单例

标签: android dagger-2 dagger-hilt


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多