мерджу два флоу и после этого дополнительно у второго флоу делаю tryEmit, мне надо чтобы мердж выше опять сработал, как такое сделать? Вот пример:
val flowA = MutableStateFlow(1)
val flowB = MutableStateFlow(2)
merge(flowA, flowB).collect { println(it) } // Напечатает 1, 2
flowB.tryEmit(3) // merge выше должен напечатать 3
со StateFlow такой трюк не работает, он напечатает 1, 2 и все, 3 не напечатает
у вас collect - терминирующая операция. После него ничего не может быть. Точнее он засуспендится навечно, пока кто-то не закроет flow
а что вместо collect здесь использовать надо?
Можно сделать onEach{..}.launchIn(...) или завернуть collect в launch, чтобы он выполнялся в другой корутине
о, работает так действительно, спасибо. А может еще подскажете, почему в rx observable - flow конвертации сделали ChannelFlow возвращаемым значением, это потому что для маппинга с rx в корутины надо использовать сабжекты чтобы мапить в stateflow/sharedflow, и observable, соответсвенно, мапится в каналы (channelFlow)?
Тут не подскажу. Но вообще ChannelFlow - это очевидный способ сделать "горчий" поток
так stateflow/sharedflow тоже горячие же
Ну там внутри тоже каналы. Вообще stateFlow появился сильно позже. Возможно интеграция с rx была уже в этот момент
Елизаров писал что sharedflow это эволюция channelflow и лучше использовать sharedflow... я сталкивался с какими-то неочевидными блокировками когда использовал channelflow и после перехода на sharedflow всё стало работать
Обсуждают сегодня