android - 我如何在 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
不能在拦截器类上使用。
请各位大侠给我一些解决办法
解决方案
@Inject constructor
如果您只是将其添加到您的 RequestInterceptor,您应该能够在 Hilt 中看到它。
例如
class RequestInterceptor @Inject constructor(private val settingsManager: SettingsManager) : Interceptor {...
而且我不确定您是否可以那样做 SettingsManager 但您可以尝试class SettingsManager @Inject constructor(@ApplicationContext context: Context) {
推荐阅读
- discord - TypeError:无法读取未定义的属性“fetchMembers”
- android - 使用 sslEngine 在 android 中获取 SSL 协议异常
- javascript - 通过从另一个文件发送刷新信号来重新渲染 FlatList?
- php - 我希望将文本类型存储在数据库中,而不是 id Ajax Laravel 7
- timestamp - 时刻js获取直到当前时间的日期
- hl7-fhir - 如何从规范生成原型文件(如 google-fhir 原型是从 FHIR 规范生成的)?
- text - 将多行文本转换为数组
- html - Bootstrap-4 justify-content-around 不适用于 flex-column
- qt - 如何在 QHBoxLayout 中对齐两个小部件,其中一个对齐最左侧,一个对齐最右侧?
- c# - EF FirstOrDefault 创建对变量的引用