#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 ваш наблюдатель за фрагментом остается активным.