Android项目中的SharedFlow未按预期工作

4

我试图使用SharedFlow从UI传递事件到ViewModel,以下是我的ViewModel类:

class MainActivityViewModel () : ViewModel() {
    val actions = MutableSharedFlow<Action>()
    private val _state = MutableStateFlow<State>(State.Idle)
    val state: StateFlow<State> = _state

    init {
        viewModelScope.launch { handleIntents() }
    }

    suspend fun handleIntents() {
        actions.collect {
            when (it) {...}
       }
   }
}

这就是我如何发出操作的方式。

private fun emitActions(action: Action) {
        lifecycleScope.launch {
        vm.actions.emit(action)
        }
    }

首次发射如预期一样进行,但之后就无法从视图模型中发射/收集。

我做错了什么吗?


你好,欢迎来到StackOverflow!您能否提供更多关于第二次调用 emitActions() 时发生了什么的上下文信息? actions.collect() 是否没有使用新值进行调用?您可以尝试调试相同的代码(在 collect { }emitActions() 中设置断点以验证其是否正常工作),并分享结果吗? - Yashovardhan99
是的,我尝试过,但执行未进入collect函数。 - noushad_chullian
3个回答

5

当我使用collectLatest()而不是collect()时,它按预期工作。


收集器会取消之前的操作。因此,当您发送0、1、2、3时,只有3会完成。之前的操作都被取消了。 - Vetalll

0

使用collectLatest()代替collect()可以隐藏问题

当你执行launch{ collect() }时,collect将会挂起launch代码块中的任何操作

因此,如果你执行

launch{
  events.collect {
    otherEvent.collect() //this will suspend the launched block indefinetly
  } }

解决方案是将每个collect都包装在自己的launch{}代码块中,collectLatest只会在发出新事件时取消挂起。

0

你尝试使用UnconfinedTestDispatcher()了吗?那应该可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接