flow
Creates a cold flow from the given suspendable block. The flow being cold means that the block is called every time a terminal operator is applied to the resulting flow.
Example of usage:
fun fibonacci(): Flow<BigInteger> = flow {
var x = BigInteger.ZERO
var y = BigInteger.ONE
while (true) {
emit(x)
x = y.also {
y += x
}
}
}
fibonacci().take(100).collect { println(it) }
Content copied to clipboard
Emissions from flow builder are cancellable by default — each call to emit also calls ensureActive.
emit
should happen strictly in the dispatchers of the block in order to preserve the flow context. For example, the following code will result in an IllegalStateException:
flow {
emit(1) // Ok
withContext(Dispatcher.IO) {
emit(2) // Will fail with ISE
}
}
Content copied to clipboard
If you want to switch the context of execution of a flow, use the flowOn operator.