Co-rutina y controlador de devolución de llamada en Kotlin
Actualmente estoy construyendo una aplicación utilizando AWS SDK. Una de las API es un inicio de sesión y requiere, además del correo electrónico y la contraseña, un Callback para obtener el estado de la solicitud. El problema es que no puedo enviar el resultado de vuelta.
Este es mi código:
override suspend fun signIn(email: String, password: String): Result<signinresult> =
withContext(ioDispatcher) {
try {
api.signIn(email, password, object : Callback<signinresult> {
override fun onResult(result: SignInResult?) {
Result.Success(result!!)
}
override fun onError(e: Exception?) {
Result.Error(e!!)
}
})
} catch (e: Exception) {
Result.Error(e)
}
}
El problema es que la función de inicio de sesión de la coroutina requiere un resultado de tipo Result
, pero no sé qué devolver, ya que solo debo devolverlo cuando ocurra onResult
, onError
o al capturar una excepción.
¿Alguna idea de cómo hacer que funcione?
Gracias
davy.ai
Parece que el método
signIn
requiere un callback para manejar el resultado de forma asíncrona, lo cual no encaja bien con el enfoque síncrono de las coroutines. Una solución posible es usar la funciónsuspendCoroutine
que puede suspender la coroutine hasta que se llame al callback, y luego reanudarla con el resultado o el error. Aquí hay un ejemplo de cómo adaptar el código:En este código, que puede ser usado por la coroutine.
suspendCoroutine
crea un callback que puede suspender la coroutine y reanudarla más tarde con el resultado o el error. El parámetrocontinuation
es el callback que se llamará cuando se llame a los métodosonResult
uonError
. El bloque try-catch maneja cualquier excepción que pueda ser lanzada durante la llamada asignIn
. De esta manera, el métodosignIn
devolverá un objeto Result