【发布时间】:2020-03-29 18:36:40
【问题描述】:
我在协程流程方面遇到了一个奇怪的问题。我有两个需要观察的流,如果其中一个发出一个值,则收集两个流并根据业务逻辑执行一些转换以发出一个结果,这是我有兴趣从片段中收集的结果。目前,我正在像这样在视图模型中进行此组合
//Done in viewmodel
val someComparisonValue = 2
val combinedFlow = firstFlow.combineTransform(secondFlow) { value1, value2 ->
if (value1 != someComparisonValue) {
emit(someValueComputed)
}else if (value1 == value2){
emit(AnotherValue)
}
// if none of these conditions are met, emit the first value instead
emit(value1)
}
// done in fragment
lifecycleScope.launchWhenCreated {
view.combinedFlow.collect {
Log.e("Logged", it.toString())
}
我的问题是,即使两个流在连接到广播通道时已经发出了值,但在创建片段时也不会收集它。然而,当片段已经创建并且另一个发射已经发送时,转换确实发生了。奇怪的部分是combineTransform 中没有条件逻辑,片段将始终在创建时获得值。似乎执行条件逻辑不是它在创建时执行的操作。有人知道如何解决这个问题吗?
【问题讨论】:
标签: android android-fragments kotlin viewmodel kotlin-coroutines