По умолчанию Flow работает на том потоке, с которого был запущен. Переключать потоки можно с помощью оператора flowOn.
kotlin
Оператор flowOn влияет на поток, на котором выполняются операторы до него в цепочке (включая flow builder). Операторы после flowOn выполняются на потоке, указанном в аргументе flowOn. Если в цепочке несколько flowOn, каждый из них влияет на часть цепочки перед ним.
Пример с несколькими flowOn:
kotlin
В этом примере:
flow builder и map будут работать на Dispatchers.Default (потому что это последний flowOn в цепочке перед ними).filter будет работать на потоке, с которого вызывается collect, то есть на потоке, где runBlocking выполняется (обычно Main в Android).Важно понимать, что flowOn создает промежуточный буфер и не является "прозрачным" переключением.