Оператор collect в Flow (и StateFlow, SharedFlow) — это терминальный оператор, без которого Flow не начнёт выполняться.
Что делает collect
flowOf(1, 2, 3).collect { value ->
println(value)
}
collect {}— это подписка наFlow- он запускает producer, и ты получаешь все значения по мере их эмиссии
- без
collect—flow {}даже не начнёт работу (он холодный!) - Аналог в Rx:
subscribe {} - Аналог в Java Streams:
.forEach {}
collect — suspend-функция
Это значит: ты не можешь вызвать collect() из обычной функции без suspend или coroutineScope. Почему collect — suspend? Потому что:
- Это позволяет строить асинхронные цепочки, которые приостанавливаются и возобновляются безопасно
Flowможет содержатьdelay,withContext,emit, и т.д.collectможет приостанавливаться, чтобы не блокировать поток
Следовательно нужно вызывать функцию collect() из другой suspend-функции или scope.