Cases

Не работает подписка на Flow из Room

Решение: если ожидается результат nullable - сделать initialValue = null.

val userFlow: StateFlow<UserDb?> = userInteractor.userFlow()
    .stateIn(
        scope = this,
        started = SharingStarted.Lazily,
        initialValue = null // Если сделать User.Empty то результат всегда будет User.Empty
    )

Отправить только новые данные из ViewModel в Presentation. Синхронно получить value.

valueStateFlow.launchAndCollectIn(viewLifecycleOwner) { value -> 
		// handle value
}

private val _valueStateFlow: MutableStateFlow<Int> = MutableStateFlow(0)
val valueStateFlow: StateFlow<Int> 
		get() = _valueStateFlow.asStateFlow()

init {
		_valueStateFlow.value = 1
		
		val result: Int = valueStateFlow.value
}

Всегда отправлять новые значения даже если они одинаковые.

valueStateFlow.launchAndCollectIn(viewLifecycleOwner) { value -> 
		// handle value
}

private val _valueStateFlow: MutableSharedFlow<Int> = MutableSharedFlow()
val valueStateFlow: SharedFlow<Int> 
		get() = _valueStateFlow.asSharedFlow()

init {
		launch {
        _valueStateFlow.emit(1)
    }
}

Отправить событие 1 раз (навигация). Работает как SingleLiveEvent.

eventFlow.launchAndCollectIn(viewLifecycleOwner) { value -> 
		// handle value
}

private val _eventChannel: Channel<Unit> = Channel(Channel.BUFFERED)
val eventFlow: Flow<Unit> 
		get() = _eventChannel.receiveAsFlow()

init {
		launch {
        _eventChannel.send(Unit)
    }
}

Run Coroutines in Parallel Using launch

Обе корутины запустятся одновременно. Первая корутина выполнится через 1 сек. Вторая корутина выполнится через 5 сек.

fun main() = runBlocking {
    val job1 = launch { doWork1() }
    val job2 = launch { doWork2() }
}

suspend fun doWork1() {
    delay(1000)
}

suspend fun doWork2() {
    delay(5000)
}

Запустить 2 операции параллельно и собрать результат?

Используем функцию awaitAll.

fun main() = runBlocking {
    val job1 = async { doWork1() }
    val job2 = async { doWork2() }
    val result = awaitAll(job1, job2)
}

suspend fun doWork1() {
    delay(1000)
}

suspend fun doWork2() {
    delay(5000)
}