无法在Kotlin中将lambda箭头表达式用于Livedata观察方法

时间:2019-06-14 21:59:48

标签: android kotlin

我是Kotlin的新手,在LiveData观察方法中使用lambda表达式时感到有些困惑。

observe方法的签名如下

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

其中Observer是具有单个方法的接口

void onChanged (T t)

但是,按以下方式在kotlin中调用上述obtain方法会产生类型不匹配错误:

 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) }

我已经阅读了this答案,该答案显示了如何使用lambda表达式(使用SAM转换)调用该方法。但是,我仍然不确定为什么简单的箭头表达式会失败。

2 个答案:

答案 0 :(得分:0)

kotlin上存在一些解析泛型的问题,所以这就是原因。 Kotlin一直在努力,您会找到整个解释 here

答案 1 :(得分:0)

LiveData没有lambda表达式,您应该将观察者接口作为对象传递

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)
}