我已经在init块中编写了合并4个流(merge(periodStart, periodEnd, selectedPeriodStart, selectedPeriodEnd)
)并输出一个修改_totalAmount
值的流的代码。问题是,当4个流中的任何一个改变时,_totalAmount
的值都不会改变。为什么_totalAmount的值没有改变?运行代码时没有错误。
_totalAmount的值不变
val _totalAmount = MutableStateFlow(0)
val totalAmount = _totalAmount.asStateFlow()
init{
merge(periodStart, periodEnd, selectedPeriodStart, selectedPeriodEnd)
.map{
withContext(Dispatchers.IO){
_totalAmount.value = soldItemRepo.getTotalAmountSoldPerPeriod(
periodStart.value ?: selectedPeriodStart.value,
periodEnd.value ?: selectedPeriodEnd.value
).first()
}
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS),
initialValue = 0
)
}
字符串
我知道,如果我在视图模型的主体中包含合并的流,如下图所示,那么每当4个流中的任何一个发生变化时,_totalAmount的值都会发生变化。
totalAmount的值发生变化
val totalAmount = merge(periodStart, periodEnd, selectedPeriodStart, selectedPeriodEnd)
.map{
withContext(Dispatchers.IO){
soldItemRepo.getTotalAmountSoldPerPeriod(
periodStart.value ?: selectedPeriodStart.value,
periodEnd.value ?: selectedPeriodEnd.value
).first()
}
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS),
initialValue = 0)
型
问问题的原因
我有几个变量依赖于periodStart, periodEnd, selectedPeriodStart, selectedPeriodEnd
,4流。我不想继续声明变量,因为我已经在上面的totalAmount
的情况下。我想有类似下面的代码
示例
这是我想要实现的一个例子。
merge(periodStart, periodEnd, selectedPeriodStart, selectedPeriodEnd).map{
val a = {...}
val b = {...}
val c = {...}
...
}
型
如果你需要任何解释,尽管问。
1条答案
按热度按时间2wnc66cl1#
我认为对于这个用例来说,一个更好的操作符是
combine
,它可以合并组合所有流的值,并根据需要使用它们(更改多个变量的值,或其他流)。你可以阅读更多关于combine
的信息,以及它和merge
here之间的区别:我测试过这个:
字符串
我已经使用了一些随机变量和流来说明你想要的东西。因为你只想合并组合几个流而不转换它们的值,
combine
部分只是简单地把它们放在一起,在一个Triple
中,我不确定你是否可以跳过这个样板部分,但some people have tackled this issue。我已经使用了
collectLatest
,但你也可以使用collect
,这取决于你的用例。尽管我已经测试过了,而且它是有效的,但我不知道直接从ViewModel的
init
块中收集这个组合流是否是一个好的做法,也许把它放在一个Job
变量中,只是为了确保你可以在需要时轻松地取消它。我会更深入地研究这一部分,也许有人可以补充,如果这真的是值得担心的事情。