Когда следует собирать события 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