La actualización del token de portador multipropósito de Ktor lleva a “intento de mutación del objeto frozen kotlin.native.internal.Ref”.
Estoy intentando que el cliente de Ktor actualice un token Bearer en un proyecto Kotlin Multiplatform.
Aquí hay un ejemplo de cómo se supone que debe funcionar.
Mi código para la configuración del cliente http es bastante similar, excepto por las diferentes solicitudes para obtener y actualizar un token:
…
install(Auth) {
lateinit var tokenInfo: TokenInfo
var refreshTokenInfo: TokenInfo
bearer {
loadTokens {
val url = "https://${environment.host}:${environment.port}/oauth/login"
tokenInfo = tokenClient.post<tokeninfo>(url) {
contentType(ContentType.Application.Json)
body = buildJsonObject {
put("username", "blah")
put("password", "blub")
}
}
BearerTokens(
accessToken = tokenInfo.data.access_token,
refreshToken = tokenInfo.data.refresh_token
)
}
refreshTokens {
val url = "https://${environment.host}:${environment.port}/oauth/refresh"
refreshTokenInfo = tokenClient.get<tokeninfo>(url) {
contentType(ContentType.Application.Json)
header(HttpHeaders.Authorization, tokenInfo.data.refresh_token)
}
BearerTokens(
accessToken = refreshTokenInfo.data.access_token,
refreshToken = refreshTokenInfo.data.access_token
)
}
}
}
Pero esto provoca “mutation attempt of frozen kotlin.native.internal.Ref”.
Parece que no le gusta “lateinit var tokenInfo: TokenInfo”.
Esto solo sucede en iOS. En Android funciona.
(Por cierto, cambié al nuevo modelo de memoria. Pero en este caso no parece importar, es el mismo error.)
davy.ai
Solución para actualizar el token de acceso en un proyecto multiplataforma de Kotlin usando el cliente Ktor
Para actualizar el token de acceso en un proyecto multiplataforma de Kotlin usando el cliente Ktor, es necesario configurar el cliente HTTP instalando
Auth
. Sin embargo, hay un problema conlateinit var tokenInfo: TokenInfo
, lo cual provoca un errormutation attempt of frozen kotlin.native.internal.Ref
en iOS, a diferencia de Android donde funciona correctamente.Para solucionar este problema, debes modificar el código para evitar el uso de
lateinit var
y en su lugar usar tiposNullable
paraTokenInfo
yrefreshTokenInfo
. Esto te permitirá asignar valores nulos a las variables antes de inicializarlas con los valores reales de las respuestas de las solicitudes. Aquí tienes cómo se debe actualizar el código:Ten en cuenta que hemos agregado
?
a la declaración de tipo paratokenInfo
yrefreshTokenInfo
. Además, hemos utilizado el operador!!
para indicar que esperamos que estas variables no sean nulas cuando accedemos a sus miembros, comodata.access_token
. Esto se debe a que sabemos que inicializaremos estas variables antes de intentar usarlas, aunque el compilador no pueda estar seguro.Con estas modificaciones, deberías poder actualizar el token de acceso utilizando el cliente Ktor y evitar el error
mutation attempt of frozen kotlin.native.internal.Ref
en iOS.