如何将 2 个 LiveData 字段的结果合并到另一个不同类型的 LiveData 字段中

How to combine the result of 2 LiveData fields into another LiveData field of a different type

我有一个 ViewModel class,其中包含 2 个可空类型的实时数据可观察对象(例如 ab) 我想添加一个新的布尔可观察对象(例如 c),只要 ab 都不为空,它就为真,否则为假。

有人建议我使用 LiveData 转换来实现此目的,但我不太确定它的工作原理。通过地图转换,我只能在单个观察者之间进行转换,但无法添加多个来源。

然后这让我考虑将 c 表示为 MediatorLiveData 并添加 ab 作为来源,但这依赖于它们都是相同的事实类型,所以我不确定我是否也可以使用它。

完成此操作的惯用方法是什么?

kotlin 的推荐方法是 StateFlow。它就像一个 liveData 但更符合 kotlin 惯用语。

这是将字符串流与 Int 流组合成布尔流的示例

class ExampleViewModel() : ViewModel() {
    private val _a = MutableStateFlow<Int>(2)
    val a = _a.asLiveData()
    private val _b = MutableStateFlow<String>("example")
    val b = _b.asLiveData()
    // this will emit a value at each update of either _a or _b
    val c = _a.combine(_b) { a, b -> a > b.length }.asLiveData()
    // this will emit a value at each update of _a
    val d = _a.zip(_b) { a, b -> a > b.length }.asLiveData()
    // this will emit a value at each update of _b
    val e = _b.zip(_a) { b, a -> a > b.length }.asLiveData()
    // this is the same as d
    val f = _a.map { it > _b.value.length }.asLiveData()
}

了解更多here