Когда следует собирать события SharedFlow в жизненном цикле фрагмента

Я подумал, что собирать данные SharedFlow на onViewCreated - это нормально. Но когда я заменяю фрагмент n раз, а затем запускаю какое-то событие в SharedFlow, он выдает мне событие n раз вместо одного события.

Я исправил, как я помещаю свой код в onCreate в свой фрагмент. Но я не нашел никакой документации по этому поводу. Мне что-то не хватает или мне следует продолжать использовать коллекции SharedFlow в onCreate in Fragment?

          override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    lifecycleScope.launchWhenResumed {
        viewModel.uiEffect.collect {
            when (it) {
                is ViewEffectWrapper.PageEffect -> {
                    if (it.pageEvent is LoginViewEffect.OpenHomePage) {
                        startActivity(
                            Intent(
                                this@LoginFragment.context,
                                HomeActivity::class.java
                            )
                        )
                    }
                }

            }
        }
    }
}

А вот мое определение SharedFlow в ViewModel

      private val _uiEffect = MutableSharedFlow<ViewEffectWrapper<LoginViewEffect>>(replay = 0)
val uiEffect: SharedFlow<ViewEffectWrapper<LoginViewEffect>> = _uiEffect

1 ответ

В настоящее время вы не используете viewLifecycleOwner и рекомендуется использовать это для Fragmentsпоскольку это связано с жизненным циклом представлений фрагментов. Это рекомендуемый способ сделать это

      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        // ...
        viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.uiEffect.collect {
                    // do stuff here
                }
            }
        }
    }

Я также хотел бы прочитать это. Это хорошее чтение, и оно стоит того, чтобы помочь вам в будущем.

https://medium.com/androiddevelopers/a-safer-way-to-collect-flows-from-android-uis-23080b1f8bda

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