SharedFlow в проекте Android не работает должным образом

Я пытался передать события из пользовательского интерфейса в viewModel, используя sharedFlow, это мой класс 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)
        }
    }

Впервые выброс происходит, как ожидалось, но затем он не излучается / не собирается из модели просмотра.

Я здесь что-то не так делаю ??

3 ответа

Решение

когда я использовал collectLatest вместо collect, он работал, как ожидалось

collectLatest() вместо collect() скрывает проблему

когда вы запускаете { collect() }, сбор приостанавливает все, что находится в блоке кода запуска.

так что если вы делаете

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

решение состоит в том, чтобы обернуть каждый сбор в свой собственный блок кода запуска {}, collectLatest просто отменит приостановку, если будет сгенерировано новое событие

Вы пытались использоватьUnconfinedTestDispatcher()? Это должно решить проблему

Другие вопросы по тегам