簡體   English   中英

Kotlin/Android 中的“賦值不是表達式”錯誤

[英]"Assignments are not expressions" error in Kotlin/Android

我得到一個Assignments are not expressions, and only expressions are allowed in this context在以下代碼的Assignments are not expressions, and only expressions are allowed in this context錯誤中Assignments are not expressions, and only expressions are allowed in this context

private fun blankFields() {
    blank_fields_error.visibility = View.VISIBLE
    Handler().postDelayed(blank_fields_error.visibility = View.INVISIBLE, 5000)
}

如果我將postDelayed()的第一個參數包裝在{}那么它工作正常 - 但我試圖理解為什么需要{}

postDelayed() 文檔

postDelayed()Runnable作為其第一個參數。 blank_fields_error.visibility = View.INVISIBLE不是Runnable 它是一個賦值語句。

由於Runnable是在 Java 中定義的接口,並且它只有一個方法,因此您可以將 Kotlin lambda 表達式作為第一個參數傳遞,Kotlin 編譯器會為您將其轉換為Runnable (請參閱Kotlin 文檔中的“SAM 轉換” )。

因此,雖然blank_fields_error.visibility = View.INVISIBLE是一個賦值,但{blank_fields_error.visibility = View.INVISIBLE}是一個恰好執行賦值的 lambda 表達式。 您可以將 lambda 表達式傳遞給postDelayed()


對於在 Java 中可能使用匿名內部類的地方,在被擴展的接口或類具有多個方法的地方,在 Kotlin 中,您可以創建一個匿名對象:

someField.addTextChangedListener(object : TextWatcher {
  fun afterTextChanged(s: Editable) {
    TODO()
  }

  fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
    TODO()
  }

  fun onTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
    TODO()
  }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM