В области жизненного цикла с двумя наблюдателями 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 чтобы было понятнее.)

Другие вопросы по тегам