этого state-flow?
Допустим, тут “foo” напечатается до “bar”
stateFlow = MutableStateFlow<Boolean>(false)
fun function1() { // это НЕ suspend функция
stateFlow.value = true
println(“bar”)
}
suspend fun function2() {
stateFlow.first { it }
println(“foo”)
}
Да не, быть такого не может. Пока у тебя выполняется какой-то код (не suspend), другая корутина на том же потоке не может работать.
private fun example() { val stateFlow = MutableStateFlow(false) launch { stateFlow.first { it } println("FIXME #3") } println("FIXME #1") stateFlow.value = true println("FIXME #2") } Выводит I: FIXME #1 I: FIXME #3 I: FIXME #2
А это всё в однопоточном диспатчере?
Да, это Dispatchers.Main.immediate Если заменить на Dispatchers.Main - то будет уже просто #1 #2 #3
immediate - это, насколько я знаю, та ещё игрушка дьявола. Но даже с ним такого как ты описываешь не должно быть.
Хотя судя по исходникам MutableStateFlow, там просто дёргается resume(), то есть у тебя state.value = ... начинает выполнять код из launch { }
Обсуждают сегодня