【发布时间】:2021-08-11 18:19:03
【问题描述】:
在 MyViewModel 中,使用 MutableStateFlow 将事件传输到片段。 当 MutableStateFlow 的值改变时,早期的值在协程内被覆盖。所以从来没有被片段接收到。
internal class MyViewModel(application: Application) : AndroidViewModel(application) {
private val myMutableStateFlow = MutableStateFlow<MySealedClass>(MySealedClass.Dummy1())
private fun getData() {
viewModelScope.launch {
//yield()
myMutableStateFlow.value = MySealedClass.Dummy2()
myMutableStateFlow.value = MySealedClass.Dummy3()
}
}
}
internal class MyFragment : Fragment(){
private var uiStateJob: Job? = null
override fun onStart() {
super.onStart()
uiStateJob = lifecycleScope.launch {
myViewModel.getUiFlow().collect {
//do something
}
}
}
}
如果对 yield() 进行了注释,则 Fragment 永远不会收到 Dummy2 事件。虽然收到了 Dummy 3。 如果 yield() 未注释 Dummy2 和 3 都收到。 如果在协程之外改变了状态值,那么 Dummy2 和 Dummy3 都会被接收。
我需要以可预见的方式接收片段中的所有事件。 这种行为有合理的理由吗?
【问题讨论】:
标签: android kotlin coroutine stateflow