【问题标题】:How can I observe two LiveData and use results together. How to implement MediatorLiveData?如何观察两个 LiveData 并一起使用结果。如何实现 MediatorLiveData?
【发布时间】:2021-05-07 23:01:47
【问题描述】:

我得到了实时数据观察者和一个需要两个观察者结果的函数。当两个观察者都收到数据时如何调用这个函数?不是代码看起来像这样

firstViewModel.dataOne.observe(viewLifecycleOwner) {
        secondViewModel.dataTwo.observe(viewLifecycleOwner) { dataTwoResult ->
            setAssociateInfo(dataTwoResult, it) // <--- send two parameters from to observers together
        }
    }

【问题讨论】:

  • 您可以将数据存储为列表或对象
  • @AnaniyaJemberu 我认为 mediatorLiveData 可能有效,但仍在实施

标签: android kotlin android-livedata


【解决方案1】:

这样的东西应该可以工作(所有代码都未经测试,但应该可以正常工作):

val a : MutableLiveData<Int> = MutableLiveData(1)
val b : MutableLiveData<String> = MutableLiveData("B")

val c : MediatorLiveData<Pair<Int?, String?>> = MediatorLiveData<Pair<Int?, String?>>().apply {
    addSource(a) { value = Pair(it, b.value) }
    addSource(b) { value = Pair(a.value, it) }
}

c.observe(lco, Observer {  })

这将类似于合并最新的。

作为一个简单的扩展函数:

fun <T, S> LiveData<T?>.combineWith(other: LiveData<S?>): LiveData<Pair<T?, S?>> =
    MediatorLiveData<Pair<T?, S?>>().apply {
        addSource(this@combineWith) { value = Pair(it, other.value) }
        addSource(other) { value = Pair(this@combineWith.value, it) }
    }

用法:

firstViewModel.dataOne.combineWith(secondViewModel.dataTwo)
              .observe(viewLifecycowner, Observer { latestPairResult ->  }

【讨论】:

    【解决方案2】:

    在我的方法中,您可以将数据存储在数据类中,而不是创建单独的变量并观察它们 喜欢

    //data class
    //you can declare the data type to be stored
    data class Datas(val data0: String , val data1: String)
    //
    //...
    //inside view model
    private val _datas = MutableLiveData<Datas> ()
    val datas: LiveData = _datas
    
    init {
        viewmodelscope.launch {
             //store the changes here
            val value = Datas("value1","value2")
            _datas.value = value
       }
    }
    

    最后你可以像这样观察它

    myviewmode.datas.observe(lifecycle){
          setAssociateInfo(it.data0, it.data1)
    }
    

    【讨论】:

    • 但是如何从两个不同的观察者那里获得对 value1 和 value2 的访问权呢?
    • 无需创建 2 个不同的观察者,您可以从 1 个观察者获得 2 个或更多值
    • 没有。这里的问题是我已经有两个观察者,我需要将那里的值合并为一个
    • 啊所以必须创建2个观察者?
    • 是的,我已经拥有它们并在活动中收听。我需要从那里合并两个值并调用函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多