gpt4 book ai didi

Kotlin Koin 未获取最新的 SharedPreferences

转载 作者:行者123 更新时间:2023-12-02 19:05:09 28 4
gpt4 key购买 nike

我有一个应用程序,每次用户登录时都会将用户数据保存在 SharedPref 中,但是当用户在前一个帐户注销后使用另一个帐户登录后,koin 仍然会获取以前的用户数据。

我已经检查了我的 createSession/save 用户数据函数及其工作正常。

这是我如何通过使用 Koin 访问 SharedPreferences 将 Auth header 放入拦截器内:

// inside interface
companion object {
fun create(sessionManager: SessionManager): AuthorizedInterface {
val at = "Bearer ${sessionManager.userDetail[ACCESS_TOKEN]!!}"

val interceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().apply {
this.level = HttpLoggingInterceptor.Level.BODY
}

val builder: OkHttpClient.Builder = OkHttpClient.Builder()
builder.connectTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.addInterceptor { chain ->
val request =
chain.request().newBuilder().addHeader("Authorization", at)
.build()
return@addInterceptor chain.proceed(request)
}

val client: OkHttpClient = builder.apply {
this.addInterceptor(interceptor)
}.build()

val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()

return retrofit.create(AuthorizedInterface::class.java)
}
}

我什至尝试传递上下文

fun create(ctx: Context): AuthorizedInterface {
val at = "Bearer ${SessionManager(ctx).userDetail[ACCESS_TOKEN]!!}"

但仍然得到相同的结果。这是我的 session 管理器:

类SessionManager(上下文:上下文){private val sharePreferences: SharedPreferences私有(private)val编辑器:SharedPreferences.Editorvar PRIVATE_MODE = 0

fun createSession(
email: String?,
fullname: String?,
username: String?,
userId: String?,
accessToken: String?
) {
editor.putBoolean(LOGIN, true)
editor.putString(EMAIL, email)
editor.putString(FULLNAME, fullname)
editor.putString(USERNAME, username)
editor.putString(USERID, userId)
editor.putString(ACCESS_TOKEN, accessToken)
editor.apply()
}

val userDetail: HashMap<String, String?>
get() {
val user =
HashMap<String, String?>()
user[EMAIL] = sharedPreferences.getString(
EMAIL,
null
)
user[FULLNAME] = sharedPreferences.getString(
FULLNAME,
null
)
user[USERNAME] = sharedPreferences.getString(
USERNAME,
null
)
user[USERID] = sharedPreferences.getString(
USERID,
null
)
user[ACCESS_TOKEN] = sharedPreferences.getString(
ACCESS_TOKEN,
null
)
return user
}

fun logout() {
editor.remove(EMAIL)
editor.remove(FULLNAME)
editor.remove(USERNAME)
editor.remove(USERID)
editor.remove(ACCESS_TOKEN)
editor.commit()
}

init {
sharedPreferences = context.getSharedPreferences(
PREF_NAME,
PRIVATE_MODE
)
editor = sharedPreferences.edit()
}
}

这是我的模块:

val module = module {
// single { AuthorizedInterface.create(context = get()) }
single { AuthorizedInterface.create(sessionManager = get()) }
single { SessionManager(context = get()) }

}

我做错了什么?为什么我无法获取最新的 SharedPref?

最佳答案

使用factory而不是single在模块中定义SessionManager。

factory { SessionManager(context = get()) }

默认情况下,Koin 有 3 种范围:

  • 单一定义:创建一个在整个容器生命周期内持续存在的对象(无法删除)。
  • 工厂定义:每次创建一个新对象。生命周期短。容器中没有持久性(无法共享)。
  • 作用域定义:创建一个与关联作用域生命周期持久绑定(bind)的对象。

因此,当您将 SessionManager 定义为 single 时,它​​仅创建一次,并且不会在 SharedPreferences 的值发生更改时更新。

查看此:Refresh auth token in Ktor while using koin

关于Kotlin Koin 未获取最新的 SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65155002/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com