如何在 okhttp 拦截器中使用 jectpack 数据存储?它需要一个上下文对象

Har*_*ang 8 android datastore kotlin android-jetpack dagger-hilt

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

\n

这是我的数据存储

\n
\nval Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")\n\nclass SettingsManager(context: Context) {\n    private val dataStore = context.dataStore\n\n    val getToken = dataStore.data\n        .catch {\n            if (it is IOException) {\n                it.printStackTrace()\n                emit(emptyPreferences())\n            } else {\n                throw it\n            }\n        }.map { preference ->\n            preference[token] ?: ""\n        }\n\n    suspend fun setToken(tokenStr: String) {\n        dataStore.edit { preferences ->\n            preferences[token] = tokenStr\n        }\n    }\n\n    companion object {\n        val token = stringPreferencesKey("token")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我无法获取拦截器 \xe3\x80\x82 中的上下文对象

\n

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

\n
class RequestInterceptor(private val settingsManager: SettingsManager) : Interceptor {\n\n    override fun intercept(chain: Interceptor.Chain): Response {\n        val request = chain.request()\n        runBlocking {\n            val first = settingsManager.getToken.first()\n            LogUtil.i("token " + first)\n            request.newBuilder().addHeader("token", first).build();\n        }\n        return chain.proceed(request)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

请各位给我一些解决方案

\n

Bar*_*ine 1

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

例如

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

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