【问题标题】:"Assignments are not expressions" error in Kotlin/AndroidKotlin/Android 中的“赋值不是表达式”错误
【发布时间】:2019-02-17 00:10:33
【问题描述】:

以下代码出现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

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

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

    由于Runnable 是Java 中定义的接口,并且它只有一个方法,因此您可以将Kotlin lambda 表达式作为第一个参数传递,Kotlin 编译器会为您将其转换为Runnable(参见@ 987654321@).

    所以,虽然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()
      }
    })
    

    【讨论】:

    • 如果Runnable 有多个方法,postDelayed() 的第一个参数会是什么样子?
    • @Zorgan:发表评论有点复杂,所以我将其添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多