我是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转换)调用该方法。但是,我仍然不确定为什么简单的箭头表达式会失败。
答案 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)
}