Ошибка «Назначения не выражения» в Kotlin / Android - PullRequest
0 голосов
/ 17 февраля 2019

Я получаю ошибку 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 () документы

1 Ответ

0 голосов
/ 17 февраля 2019

postDelayed() принимает Runnable в качестве первого параметра.blank_fields_error.visibility = View.INVISIBLE не является Runnable.Это оператор присваивания.

Поскольку Runnable - это интерфейс, определенный в Java, и он имеет единственный метод, вы можете передать лямбда-выражение Kotlin в качестве первого параметра, и компилятор Kotlin преобразует его вRunnable для вас (см. «Преобразования SAM» в документации Kotlin ).

Итак, в то время как blank_fields_error.visibility = View.INVISIBLE является присваиванием, {blank_fields_error.visibility = View.INVISIBLE} является лямбда-выражением, которое происходит свыполнить назначение.Вы можете передать лямбда-выражение в 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()
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...