Android 如何将两个LiveData字段的结果合并到另一个不同类型的LiveData字段中
我有一个ViewModel类,它有两个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
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时选择此选项: