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()
? Это должно решить проблему