我是 Kotlin 語言的新手,不知道如何從以下函式回傳變數。
你能幫忙嗎?
這是代碼...
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和companyNumber以便我可以在其他地方使用它。
附注。當我嘗試使用時,我收到Return companyNumber一條訊息,指出此處不允許“回傳”。
uj5u.com熱心網友回復:
通常對于 lambda,您不會顯式return指定值 - lambda 回傳最后一個運算式的值。以您的代碼為例(它實際上不起作用,但我們會解決這個問題!):
handler.post {
...
companyNumber
}
這與map呼叫之類的事物采用轉換函式的方式相同
listOf(1, 2, 3).map { it * 2 }
這只是將每個數字加倍,但結果是隱式回傳并存盤在結果串列中,對嗎?它可以讓你將 lambdas 鏈接在一起,因為每個 lambda 運算式都評估為一個值(Unit如果它“不回傳結果” ,則可能是這樣)
如果需要,您可以明確使用所謂的合格回傳:
handler.post {
...
return@post companyNumber
}
您命名要回傳的函式呼叫的位置。
Kotlin 檔案:從 lambda 運算式回傳一個值
此外,如果您想回傳兩個值,則不能這樣做 - 因此您必須將它們捆綁在一個物件中。您可以只回傳 a Pair,或者創建一個更具可讀性的資料類:
return@post Pair(companyName, companyNumber)
//or
data class CompanyDeets(val name: String, val number: String)
...
return@post CompanyDeets(companyName, companyNumber)
但是除了您通常的做法之外,您為什么要在這里回傳任何東西?Handler#post接受一個Runnable不回傳任何內容(void在 Java 中),并且View.OnClickListener#onClick也不回傳任何內容。
他們都不會對你回傳的值做任何事情——如果你明確回傳一個值,這意味著你的 lambda 簽名不匹配(現在它隱式回傳Unit以匹配呼叫者的期望),你會得到一個錯誤
相反,您可能想要做的是在您的類(Activity或其他)中創建一個使用您的資料的函式,例如fun doSomethingWith(companyName: String, companyNumber: String)并在您的 lambda 中呼叫它。這就是你執行代碼以回應點擊的方式
uj5u.com熱心網友回復:
只需在全域宣告 var Company Name,或使用該引數創建一個函式
var companyName:字串?= 空
handler.post { ... companyName = result.substringAfter("Name: ").substringBefore(";") }
或者
handler.post { ... save(result.substringAfter("Name: ").substringBefore(";")) }
有趣的保存(公司名稱:字串){ ... }
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/385784.html
