【问题标题】:How do you pass a callback function that returns a LiveData using Kotlin lambdas?如何使用 Kotlin lambda 传递返回 LiveData 的回调函数?
【发布时间】:2020-06-21 13:19:57
【问题描述】:

在 Android 中,我有一个 ListAdapter,我使用 Kotlin 的 lambda 表示法将回调传递给它。

例如,ListAdapter 有:

var clickCallback = { _: Long  -> Unit }

在调用 ListAdapter 的 Fragment 中设置:

mAdapter.clickCallback = {id: Long -> selectItem(id)}

这个 Fragment 函数 selectItem(id: Long) 然后在 ListAdapter 中被调用:

clickCallback(item.id) 

但是,如果传递的函数selectItem() 返回一个值,例如 LiveData,并且我想调用该函数并从适配器内部观察该 LiveData,该怎么办?我一辈子都想不通如何传递这样一个函数,以便可以观察到 ListAdapter 内部的回调函数。

这甚至没有接近工作,但希望它能让您了解我正在寻找的解决方案:

var clickCallback:LiveData<String> = { _: Long  -> Unit?? }
....
clickCallback(item.id).observe(holder.ItemView, Observer { answerString -> 
    doSomethingTo(answerString)
})

如果您知道如何在 ListAdapter 中获取 viewLifecycleOwner,则可以加分。我只是猜测它是 holder.ItemView。

谢谢!

约翰

【问题讨论】:

  • 不知道你想用{} 创建一个 lambda,但可能你想做:clickCallback: (Long) -&gt; LiveData&lt;String&gt;

标签: android kotlin lambda


【解决方案1】:

创建一个返回对象的回调很简单。只需对 lambda 类型使用下一个语法:

var callback: (([Params]) -> ReturnType)? = null

代码是:

var clickCallback: ((Long) -> LiveData<String>)? = null

clickCallback?.invoke(item.id)?.observe(holder.ItemView, Observer { answerString ->
    doSomethingTo(answerString)
})

如果您想要使用默认实现的回调,它将是:

var clickCallback: (Long) -> LiveData<String> = { _: Long  -> MutableLiveData() }

clickCallback(item.id).observe(holder.ItemView, Observer { answerString ->
    doSomethingTo(answerString)
})

如果您知道如何在 ListAdapter 中获取 viewLifecycleOwner,则可以加分。我只是猜测它是 holder.ItemView。

可以通过传递viewLifecycleOwner作为构造函数参数来实现:

    // adapter definition
    class YourAdapter(private val lifecycleOwner: LifecycleOwner) ...
    
    // passing viewLifecycleOwner as constructor parameter
    val adapter = YourAdapter(viewLifecycleOwner)

现在您可以访问YourAdapter 中的lifecycleOwner 属性。

【讨论】:

  • 谢谢谢尔盖,这个答案非常有效。请问,为什么在您描述为“默认实现”的 lambda 中使用 MutableLiveData() 而不是 LiveData ?它有效,但我不明白发生了什么。
  • 在默认实现中你需要返回LiveData类型的东西,我们不能创建LiveData本身的实例,因为它是abstract,所以我使用了MutableLiveData
猜你喜欢
  • 2018-01-26
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多