简体   繁体   English

如何在Kotlin函数中返回变量对象

[英]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: 我是kotlin开发的新手,我需要使用Any在一个函数中返回String或List var,但是我无法获得预期的结果:

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? 当我在Android Studio的logCat中看到日志以查看函数返回的内容仅显示为'[]'时,是否有解决我的菜鸟问题的建议?

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. 您的问题是您在执行异步调用后正在处理返回,这导致在获得响应之前进行返回-因此,既不会设置错误或SellersList,也不会返回空列表。 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 通过T并相应地处理

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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