0

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

有人建议我使用 LiveData 转换来实现这一点,但我不太确定它是如何工作的。使用地图转换,我只能在单个观察者之间转换,但不能添加多个源。

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

实现此目的的惯用方法是什么?

4

1 回答 1

1

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

这是将 String 流与 Int 流组合成 Boolean 流的示例

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

在这里了解更多

于 2020-12-29T02:06:19.943 回答