我想在拦截器中添加一个令牌到请求头。但是现在我不知道该怎么做。
这是我数据存储
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中获取上下文对象。
所以我试着用刀柄来固定它
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
不能在拦截器类上使用。
请各位给予我一些解决办法
3条答案
按热度按时间yzckvree1#
我只是用这种方式。
在拦截器内部,您可以获得如下runBlocking UI。
在Module类中,像这样使用。
kknvjkwl2#
如果您只是将
@Inject constructor
添加到RequestInterceptor中,您应该能够在Hilt中看到它。例如
class RequestInterceptor @Inject constructor(private val settingsManager: SettingsManager) : Interceptor {...
我不确定您是否可以像这样使用SettingsManager,但您可以尝试使用
class SettingsManager @Inject constructor(@ApplicationContext context: Context) {
kmbjn2e33#
这对我有用