简体   繁体   中英

How to return a variable object in kotlin function

I´m newbie in kotlin development, and I need to return a String or an a List var in one function with Any, but I can't get the expected result:

fun loadEmployeesFromApi ():Any {
        var error = false
        var message = ""
        var sellersList:List<SellersItem> = emptyList()
        retrofit?.let {
            val service = it.create(ApiService::class.java)
            val call = service.listEmployeesData("getSellers")

            call.enqueue(object: Callback<ResponseSellers> {
                override fun onFailure(call: Call<ResponseSellers>, t: Throwable) {
                    error = true
                    message = "No se pudieron obtener los registros de vendedores debido a un problema de conexión al servidor"
                }
                override fun onResponse(call: Call<ResponseSellers>, response: Response<ResponseSellers>) {
                    val code  = try {
                        response.body()!!.code!!.toInt()
                    } catch (e: NumberFormatException) {
                        0
                    }
                    when (code) {
                        200 -> {
                            /** response.body().sellers retorna una sellers: list<SellersItem> con los registros de los vendedores que pueden acceder a la app
                             **Datos que contiene el objeto:
                             ** usuario
                             * id
                             * nombre
                             * contrasenia
                             **/
                            sellersList = response.body()?.sellers as List<SellersItem>
                        } 0 -> {
                            error = true
                            message = "No se pudieron obtener los registros de vendedores, el servidor no retornó una respuesta"
                        } 404 -> {
                            error = true
                            message = "No hay registros de vendedores activos"
                        } else -> {
                            error = true
                            message = "Ocurrió un error al obtener los registros de vendedores, el servidor retornó $code de respuesta"
                        }
                    }
                }
            })
        }
        return if (error) {
            message
        } else {
            sellersList
        }
    }

when I see the logs in logCat of Android Studio for see what my function returns only show '[]', any sugestion for my noob problem?

your problem is that you are handling the return after doing an asynchronous call, this causes the return to be made before you get the response - So neither the error or sellersList is ever getting set and its just returning an empty list. Instead of returning something directly you may want to consider passing in a success and error callback or a listener as a parameter and then give the result to the callback.

something like:

fun loadEmployeesFromApi (successCallback: (List<SellersItem>)->Unit, errorCallback: (String)->Unit) { 

     ...

and make the call when you load the data

when (code) {
    200 -> {
        /** response.body().sellers retorna una sellers: list<SellersItem> con los registros de los vendedores que pueden acceder a la app
        **Datos que contiene el objeto:
        ** usuario
        * id
        * nombre
        * contrasenia
        **/
        sellersList = response.body()?.sellers as List<SellersItem>
        successCallback(sellersList)
    } 0 -> {
        error = true
        message = "No se pudieron obtener los registros de vendedores, el servidor no retornó una respuesta"
        errorCallback(message)
    } 404 -> {
        error = true
        message = "No hay registros de vendedores activos"
        errorCallback(message)
    } else -> {
        error = true
        message = "Ocurrió un error al obtener los registros de vendedores, el servidor retornó $code de respuesta"
        errorCallback(message)
    }
}

and you can make the call like this:

loadEmployeesFromApi({ sellerList ->
    // handle success
}, { errorMessage ->
    // handle error
})

You need to use a generic concept here.

pass T and handle accordingly

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM