繁体   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