【发布时间】:2021-09-23 03:45:25
【问题描述】:
我正在尝试使用拦截器内的流从数据存储中调用方法,但它不起作用。
正确的做法是什么?
在这里我定义了我的拦截器
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] ?: ""
}
}
我认为我的问题在于流程
【问题讨论】:
-
这与jetpack compose无关。使用 runBlocking,然后在流上首先调用。
标签: android kotlin android-jetpack-compose android-jetpack