Home > OS >  Kotlin - How To Return Nested Variable?
Kotlin - How To Return Nested Variable?

Time:12-19

I am new in Kotlin Language and don't know how to RETURN variable from the following function.
Can you please help ?

Here is the code...

downloadData.setOnClickListener {

            val handler = Handler(Looper.getMainLooper())
            handler.post {
                val fetchData =
                    FetchData("http://localhost/xampp/CRM/PHP/show_contacts_db.php")

                if (fetchData.startFetch()) {
                    if (fetchData.onComplete()) {
                        val result = fetchData.data.toString()
                        
                        Log.i("FetchData", result)
                        

                        val companyName = result.substringAfter("Name: ").substringBefore(";")
                        showContactName.text = "${companyName}"
                        val companyNumber = result.substringAfter("Number: ").substringBefore(";")
                        showContactNumber.text = "${companyNumber}"
                    }
                }
            }
        }

companyName and companyNumber needed to be returned so I can use it in other places.

PS. When I Try to use Return companyNumber I have a message that "return" is not allowed here.

CodePudding user response:

Generally with lambdas, you don't explicitly return a value - the lambda returns the value of the last expression. Using your code as an example (it won't actually work but we'll get to that!):

handler.post {
    ...
    companyNumber
}

which is the same as how things like map calls take a transformation function

listOf(1, 2, 3).map { it * 2 }

that's just doubling each number, but the result is being implicitly returned and stored in the resulting list, right? And it lets you chain lambdas together, since each one evaluates to a value (which might be Unit if it "doesn't return a result")

If you want, you can explicitly use what's called a qualified return:

handler.post {
    ...
    return@post companyNumber
}

where you're naming the function call you're returning to.

Kotlin docs: returning a value from a lambda expression


Also if you want to return two values, you can't do that - so you'll have to bundle them up in a single object. You could just return a Pair, or create a data class that's more readable:

return@post Pair(companyName, companyNumber)

//or
data class CompanyDeets(val name: String, val number: String)
...
return@post CompanyDeets(companyName, companyNumber)

But aside from how you do it in general, why do you want to return anything here? Handler#post takes a Runnable which returns nothing (void in Java), and View.OnClickListener#onClick doesn't return anything either.

Neither of them would do anything with a value you returned - and if you explicitly return a value, that means your lambda's signature doesn't match (right now it's implicitly returning Unit to match what's expected by the caller), and you'll get an error

What you probably want to do instead, is create a function inside your class (Activity or whatever) that uses your data, something like fun doSomethingWith(companyName: String, companyNumber: String) and call that inside your lambda. That's way you're executing code in reaction to a click

CodePudding user response:

just declare var Company Name in global, or create a function with that params

var companyName: String? = null

handler.post { ... companyName = result.substringAfter("Name: ").substringBefore(";") }

OR

handler.post { ... save(result.substringAfter("Name: ").substringBefore(";")) }

fun save(companyName: String){ ... }

  • Related