我在以下代码上遇到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()
的第一个参数包装在{}
中,则可以正常工作-但我试图理解为什么需要{}
。
答案 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()
}
})