Используйте MutableStateFlow в качестве горячего потока, Kotlin Android

#android #kotlin-coroutines

#Android #kotlin-сопрограммы

Вопрос:

Я перехожу с LiveData на Flow и столкнулся со следующей проблемой:

У меня есть поток в ViewModel

 class MyViewModel() : ViewModel() {
   val state = MutableStateFlow<Boolean>(false)
}

class FirstFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    lifecycleScope.launchWhenCreated {
        viewModel.loginPresenterState.startVerifyFragmentEvent.collectLatest {
            Log.d("Nurs", "loginPresenterState $it")
            if (it)
                findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }
    }
}
  

}

когда этот поток запускается, мой FirstFragment переходит к другому фрагменту «B». Но когда я нажимаю кнопку «Назад», state срабатывает еще раз, и вместо перехода к FirstFragment я возвращаюсь к «B». Я полагаю, что такое поведение связано с тем, что поток холодный. Как сделать так, чтобы он вызывался только один раз?

Комментарии:

1. Смотрите документацию: developer.android.com/kotlin/flow/stateflow-and-sharedflow

Ответ №1:

Вероятно, потому, что состояния остаются неизменными, и когда вы возвращаетесь, он повторно наблюдает за состоянием и перемещается. Проверьте эту статью и используйте EventWrapper, который упоминается в статье. Он использовал livedata, но та же логика применима и к stateflow. Статья