首页 > 解决方案 > 在拦截器中调用 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] ?: ""
        }
}

我认为我的问题在于流量

标签: androidkotlinandroid-jetpack-composeandroid-jetpack

解决方案


您可以使用它与
val getRefreshToken =runBlocking { session.getRefreshToken() }

之后你就可以使用它了。


推荐阅读