Kotlin / Android中的“赋值不是表达式”错误

时间:2019-02-17 00:10:34

标签: android kotlin

我在以下代码上遇到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() docs

1 个答案:

答案 0 :(得分:3)

postDelayed()Runnable作为其第一个参数。 blank_fields_error.visibility = View.INVISIBLE不是Runnable。这是一个赋值语句。

由于Runnable是用Java定义的接口,并且具有单个方法,因此您可以将Kotlin lambda表达式作为第一个参数传递,并且Kotlin编译器会将其转换为Runnable您(请参阅"SAM Conversions" in the Kotlin documentation)。

因此,尽管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()
  }
})