Невозможно использовать лямбда-выражение стрелки для метода наблюдения Livedata в Kotlin - PullRequest
2 голосов
/ 15 июня 2019

Я новичок в kotlin, и я немного запутался при использовании лямбда-выражения в методе наблюдения LiveData.

Подпись для метода наблюдения выглядит следующим образом:

observe(LifecycleOwner owner, Observer<? super T> observer)

, где Observer - это интерфейс с единственным методом

void onChanged (T t)

Однако, вызов метода наблюдения выше в kotlinследующее приводит к ошибке несоответствия типов:

 val myViewModel = ViewModelProviders.of(this).get(AnimeListViewModel::class.java)

 myViewModel.animes.observe(this, { anime -> println(anime) })

Разве это не то же самое, что вызов setOnClickListener для представления.Следующий фрагмент кода работает без ошибок компиляции:

val myView = View(this)

myView.setOnClickListener { view -> println(view) }

Я уже прочитал этот ответ, который показывает, как вызвать метод с использованием лямбда-выражения (с использованием преобразования SAM).Тем не менее, я все еще не уверен, почему простое выражение стрелки не сработало.

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

LiveData не имеет лямбда-выражения, вы должны передать интерфейс наблюдателя как объект

myViewModel.animes.observe(this, Observer { anime -> println(anime) })

Или путем создания функции расширения, подобной этой

fun <T : Any> LiveData<T>.observe(lifecycleOwner: LifecycleOwner, block: (T) -> Unit) = observe(lifecycleOwner, Observer(block))

И называя это так

myViewModel.animes.observe(this) { anime -> println(anime) }

Или вот так

fun main() {
   myViewModel.animes.observe(this, ::handleLiveData)
}

fun handleLiveData(anime: Anime) {
   println(anime)
}
0 голосов
/ 15 июня 2019

Есть некоторые проблемы в kotlin для разрешения дженериков, вот в чем причина. Котлин работал над этим, и вы найдете все объяснение здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...