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

Android 如何将两个LiveData字段的结果合并到另一个不同类型的LiveData字段中,android,android-livedata,android-livedata-transformations,Android,Android Livedata,Android Livedata Transformations,我有一个ViewModel类,它有两个livedata可观察对象(例如a和b),它们都是可空类型和 我想添加一个新的布尔可观测值(例如c),只要a和b都不为空,则为true,否则为false 有人建议我使用LiveData转换来实现这一点,但我不太确定这将如何工作。使用贴图变换,我只能在单个观察者之间进行变换,但不能添加多个源 然后,这让我考虑将c表示为一个中介livedata,并将a和b添加为源,但这取决于它们都是相同类型的事实,因此我不确定是否可以使用它们 实现这一点的惯用方法是什么?kot

我有一个ViewModel类,它有两个livedata可观察对象(例如
a
b
),它们都是可空类型和 我想添加一个新的布尔可观测值(例如
c
),只要
a
b
都不为空,则为true,否则为false

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

然后,这让我考虑将
c
表示为一个中介livedata,并将
a
b
添加为源,但这取决于它们都是相同类型的事实,因此我不确定是否可以使用它们


实现这一点的惯用方法是什么?

kotlin的推荐方法是。它类似于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()
}
class ExampleViewModel():ViewModel(){
private val_a=MutableStateFlow(2)
val a=_a.asLiveData()
private val_b=MutableStateFlow(“示例”)
val b=_b.asLiveData()
//这将在每次更新_a或_b时发出一个值
val c=_a.combine(_b){a,b->a>b.length}.asLiveData()
//这将在每次更新_a时发出一个值
val d=_a.zip(_b){a,b->a>b.length}.asLiveData()
//这将在每次更新_b时发出一个值
val e=_b.zip(_a){b,a->a>b.length}.asLiveData()
//这和d一样
val f=_a.map{it>_b.value.length}.asLiveData()
}

了解更多信息

您想要java或kotlin的答案吗?我正在kotlin中寻找一些东西。请在使用Transformation或MediatorLiveData时选择此选项: