Android — Observe не работает после навигации

#android #navigation #state #viewmodel #android-livedata

#Android #навигация #состояние #viewmodel #android-livedata

Вопрос:

Я сейчас разрабатываю приложение, и я столкнулся с одной проблемой. У меня простой экран входа в систему. Я использую поток Kotlin для emit разных состояний как Loading , Success , Failure . Когда состояние Loading такое, я хочу перенаправить пользователя на экран загрузки. После этого, когда состояние Success такое, я хочу перейти к пользователю на главный экран. Но другое состояние, чем Loading никогда не вызывается. Это работает, когда я удаляю навигацию из Loading состояния. Я полагаю, что после того, как навигация к экрану загрузки будет viewModel очищена, я попытался зарегистрировать ее, но она не выводит мне сообщение на консоль.

 private val viewModel: SignInViewModel by viewModels()


private fun observeSignIn() {
    viewModel.signIn.observe(viewLifecycleOwner, {
        when (it) {
            is Status.Loading -> findNavController().navigate(R.id.loadingFragment)
            is Status.Failure -> {
                findNavController().navigateUp()
                showErrorSnackBar(sv_sign_in, it.message)
            }
            is Status.Success -> {
                findNavController().navigateUp()
                findNavController().navigate(R.id.homeFragment)
            }
        }
    })
}
 

Возможно, возможным решением было бы использовать viewModel initialized by navGraphViewModels , но для меня это не имеет смысла, потому что я использую этот экран загрузки для других экранов…

Спасибо за помощь 🙂

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

1. Если это ваш фрагмент, и вы переходите к другому, когда загружается статус, просмотр этого фрагмента останавливается, потому что вы переходите к другому. Этот фрагмент отправляется обратно.

2. Знаете ли вы какое-либо возможное решение?

3. Как вы сказали с navGraphViewModel или простой общей ViewModel между вашими фрагментами, вы можете поместить своего наблюдателя в эту ViewModel. Но, насколько я вижу, вы хотите только показать экран загрузки, а затем перейти к своему домашнему фрагменту. Поэтому, возможно, лучшим решением будет DialogFragment, который занимает весь экран. Вы можете показать фрагмент диалогового окна для загрузки, и когда он будет завершен, вы закроете диалоговое окно. С помощью DialogFragment ваш наблюдатель за фрагментом остается активным.