В области жизненного цикла с двумя наблюдателями StateFlow работает только первый.
Мне кажется, я чего-то не совсем понимаю. Не могли бы вы объяснить мне, почему, когда я использую этот пример, у меня работает только первый сбор.
lifecycleScope.launch {
viewModel.test1.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).collect {
Log.i("Log_tag", it)
}
viewModel.test2.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).collect {
Log.i("Log_tag", it)
}
}
или если я назову их так:
lifecycleScope.launch {
viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED){
viewModel.test1.collect {
Log.i("Log_tag", it)
}
viewModel.test2.collect {
Log.i("Log_tag", it)
}
}
}
Но если я вызываю их в разных сопрограммах, они работают в обоих, как здесь:
lifecycleScope.launch {
viewModel.test1.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).collect {
Log.i("Log_tag", it)
}
}
lifecycleScope.launch {
viewModel.test2.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED).collect {
Log.i("Log_tag", it)
}
}
viewModel:
class ForecastViewModel : ViewModel() {
private val _test1 = MutableStateFlow("")
private val _test2 = MutableStateFlow("")
val test1 = _test1.asStateFlow()
val test2 = _test2.asStateFlow()
fun getTest() {
viewModelScope.launch {
_test1.value = "test1"
_test2.value = "test2"
}
}
1 ответ
Решение
Сбор
StateFlow
никогда не завершается, потому что StateFlows не завершаются.
Это вполне ожидаемо. Запуск параллельных сборщиков - это правильно.
(Интересно, могут ли они "переопределить"
StateFlow.collect
иметь возвращаемый тип
Nothing
чтобы было понятнее.)