如何将 2 个 LiveData 字段的结果合并到另一个不同类型的 LiveData 字段中
How to combine the result of 2 LiveData fields into another LiveData field of a different type
我有一个 ViewModel class,其中包含 2 个可空类型的实时数据可观察对象(例如 a
和 b
)
我想添加一个新的布尔可观察对象(例如 c
),只要 a
和 b
都不为空,它就为真,否则为假。
有人建议我使用 LiveData 转换来实现此目的,但我不太确定它的工作原理。通过地图转换,我只能在单个观察者之间进行转换,但无法添加多个来源。
然后这让我考虑将 c
表示为 MediatorLiveData 并添加 a
和 b
作为来源,但这依赖于它们都是相同的事实类型,所以我不确定我是否也可以使用它。
完成此操作的惯用方法是什么?
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
我有一个 ViewModel class,其中包含 2 个可空类型的实时数据可观察对象(例如 a
和 b
)
我想添加一个新的布尔可观察对象(例如 c
),只要 a
和 b
都不为空,它就为真,否则为假。
有人建议我使用 LiveData 转换来实现此目的,但我不太确定它的工作原理。通过地图转换,我只能在单个观察者之间进行转换,但无法添加多个来源。
然后这让我考虑将 c
表示为 MediatorLiveData 并添加 a
和 b
作为来源,但这依赖于它们都是相同的事实类型,所以我不确定我是否也可以使用它。
完成此操作的惯用方法是什么?
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