Вопрос:
Как я могу предотвратить немедленное получение моими данными устаревших данных при навигации назад?Я использую класс Event
, обозначенный здесь , который, как я думал, предотвратит это.
Проблема:
Я открываю приложение с фрагментом входа в систему и перехожу к фрагменту регистрации, когда установлена электронная почта / пароль для оперативных данных (и бэкэнд-вызов говорит "это новый аккаунт иди регистрируйся)).Если пользователь нажимает кнопку «Назад» во время регистрации, Android возвращается обратно для входа в систему.Когда после логического нажатия фрагмент логина воссоздается , он немедленно снова запускает текущие данные с устаревшим ответом бэкэнда, и я хотел бы предотвратить это.
LoginFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
subscribeToLoginEvent()
}
private fun subscribeToLoginEvent() {
//When a back press occurs, we subscribe again and this instantly
//fires with the same data it used to leave the screen
//(a Resource<User> with status=SUCCESS, data = null)
viewModel.user.observe(viewLifecycleOwner, Observer { response ->
Timber.i("login event observed....status:" + response?.status + ", data: " + response?.data)
binding.userResource = response
response?.let {
val status = it.status
val message = it.message
if (status == Status.SUCCESS && it.data == null) {
//This is a brand new user so we need to register now
navController()
.navigate(LoginFragmentDirections.showUserRegistration()))
}
else if(status == Status.SUCCESS && it.data != null){
goHome()
}
}
})
}
LoginViewModel.kt
private val _loginCredentials: MutableLiveData<Event<Pair<String, String>>> = MutableLiveData()
val user: LiveData<Resource<User>> = Transformations.switchMap(_loginCredentials) {
val data = it.getContentIfNotHandled()
if(data != null && data.first.isNotBlank() && data.second.isNotBlank())
interactor.callUserLoginRepo(data.first, data.second)
else
AbsentLiveData.create()
}