Как вернуть переменный объект в функцию kotlin - PullRequest
0 голосов
/ 13 февраля 2019

Я новичок в разработке kotlin, и мне нужно вернуть переменную String или List в одной функции с Any, но я не могу получить ожидаемый результат:

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
        }
    }

, когда ясм. логи в logCat Android Studio, чтобы увидеть, что моя функция возвращает только show '[]', есть предложение для моей проблемы с noob?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вам необходимо использовать общую концепцию здесь.

пройти T и обработать соответственно

0 голосов
/ 13 февраля 2019

Ваша проблема в том, что вы обрабатываете возврат после выполнения асинхронного вызова, это вызывает возврат до того, как вы получите ответ - так что ни ошибка, ни sellersList никогда не устанавливаются, а просто возвращается пустой список.Вместо того, чтобы возвращать что-то напрямую, вы можете рассмотреть возможность передачи обратного вызова об успешном завершении и ошибке или прослушивателя в качестве параметра, а затем передать результат обратному вызову.

что-то вроде:

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

     ...

и сделать вызов, когда вы загружаете данные

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)
    }
}

, и вы можете сделать вызов следующим образом:

loadEmployeesFromApi({ sellerList ->
    // handle success
}, { errorMessage ->
    // handle error
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...