首页 > 解决方案 > 我如何在 okhttp Interceptor 中使用 jectpack 数据存储?它需要一个上下文对象

问题描述

我想在 Interceptor 中添加一个令牌来请求标头。但现在我不知道我该怎么办。

这是我的数据存储


val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")

class SettingsManager(context: Context) {
    private val dataStore = context.dataStore

    val getToken = dataStore.data
        .catch {
            if (it is IOException) {
                it.printStackTrace()
                emit(emptyPreferences())
            } else {
                throw it
            }
        }.map { preference ->
            preference[token] ?: ""
        }

    suspend fun setToken(tokenStr: String) {
        dataStore.edit { preferences ->
            preferences[token] = tokenStr
        }
    }

    companion object {
        val token = stringPreferencesKey("token")
    }
}

我无法在 Interceptor 中获取上下文对象。</p>

所以我尝试使用刀柄来修复它

class RequestInterceptor(private val settingsManager: SettingsManager) : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        runBlocking {
            val first = settingsManager.getToken.first()
            LogUtil.i("token " + first)
            request.newBuilder().addHeader("token", first).build();
        }
        return chain.proceed(request)
    }
}

我不知道下一步@AndroidEntryPoint不能在拦截器类上使用。

请各位大侠给我一些解决办法

标签: androidkotlinandroid-jetpackdatastoredagger-hilt

解决方案


@Inject constructor如果您只是将其添加到您的 RequestInterceptor,您应该能够在 Hilt 中看到它。

例如

class RequestInterceptor @Inject constructor(private val settingsManager: SettingsManager) : Interceptor {...

而且我不确定您是否可以那样做 SettingsManager 但您可以尝试class SettingsManager @Inject constructor(@ApplicationContext context: Context) {


推荐阅读