android - 在拦截器中调用 DataStore
问题描述
我正在尝试使用拦截器内的流从数据存储中调用一个方法,但它不起作用。
正确的方法是什么?
在这里我定义了我的拦截器
class AuthorizationInterceptor @Inject constructor(
@ApplicationContext private val appContext: Context,
) : HttpInterceptor {
private val authPreferences = AuthPreferences(appContext)
override suspend fun intercept(
request: HttpRequest,
chain: HttpInterceptorChain
): HttpResponse {
// here I try to get the token
var tokenString = "";
authPreferences.getAccessToken.collect { token ->
tokenString = token
}
return chain.proceed(request.withHeader("Authorization", "Bearer $tokenString"))
//return chain.proceed(request.withHeader("Authorization", "Bearer 1111"))
}
}
在这里我定义了我的商店
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore("auth_pref");
class AuthPreferences(private val context: Context) {
companion object {
val AUTH_ACCESS_TOKEN = stringPreferencesKey(name = "auth_access_token")
val AUTH_REFRESH_TOKEN = stringPreferencesKey(name = "auth_refresh_token")
}
suspend fun saveAccessToken(token: String) {
context.dataStore.edit { preferences ->
preferences[AUTH_ACCESS_TOKEN] = token
}
}
val getAccessToken: Flow<String> = context.dataStore.data
.map { preferences ->
preferences[AUTH_ACCESS_TOKEN] ?: ""
}
suspend fun saveRefreshToken(token: String) {
context.dataStore.edit { preferences ->
preferences[AUTH_REFRESH_TOKEN] = token
}
}
val getRefreshToken: Flow<String> = context.dataStore.data
.map { preferences ->
preferences[AUTH_REFRESH_TOKEN] ?: ""
}
}
我认为我的问题在于流量
解决方案
您可以使用它与
val getRefreshToken =runBlocking { session.getRefreshToken() }
之后你就可以使用它了。
推荐阅读
- python - 显示在 printf 语句之外的值
- java - 在 java 中为 tesseract OCR 预处理图像(局部阈值)?
- ruby - RubyMine 调试 gem 版本与公共 gem 版本不同
- python - Gensim Word2Vec 的内部工作原理
- ios - 你如何为 iOS DatePicker Xamarin 制作自定义渲染器
- amazon-web-services - 如何正确使用安全组内的 VpcId 属性?
- javascript - 如何在Angular的嵌套地图函数中收集每个用户的所有响应?
- python - 使用 PostGIS 查找最近点
- java - 即使在 Android 上的权限被拒绝时,应用程序也会将文件下载到存储中
- javascript - 如何更改此对象属性分配以避免原型污染