gpt4 book ai didi

android - 无法对 Kotlin 中的 Livedata 观察方法使用 lambda 箭头表达式

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:33 26 4
gpt4 key购买 nike

我是 kotlin 的新手,在 LiveData observe 方法中使用 lambda 表达式时我有点困惑。

observe方法的签名如下

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

Observer 是一个只有一个方法的接口(interface)

void onChanged (T t)

但是,在 kotlin 中调用上面的 observe 方法如下所示会出现类型不匹配错误:

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

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

这与在 View 上调用 setOnClickListener 不同吗?下面这段代码可以完美运行,没有任何编译错误:

val myView = View(this)

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

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

最佳答案

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

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

关于android - 无法对 Kotlin 中的 Livedata 观察方法使用 lambda 箭头表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56605623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com