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)
}