es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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ón suspendCoroutine 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:

    override suspend fun signIn(email: String, password: String): Result<signinresult> =
            suspendCoroutine { continuation ->
                try {
                    api.signIn(email, password, object : Callback<signinresult> {
                        override fun onResult(result: SignInResult?) {
                            continuation.resume(Result.Success(result!!))
                        }
    
                        override fun onError(e: Exception?) {
                            continuation.resume(Result.Error(e!!))
                        }
                    })
                } catch (e: Exception) {
                    continuation.resume(Result.Error(e))
                }
            }
    

    En este código, suspendCoroutine crea un callback que puede suspender la coroutine y reanudarla más tarde con el resultado o el error. El parámetro continuation es el callback que se llamará cuando se llame a los métodos onResult u onError. El bloque try-catch maneja cualquier excepción que pueda ser lanzada durante la llamada a signIn. De esta manera, el método signIn devolverá un objeto Result que puede ser usado por la coroutine.

Comments are closed.