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.