Я использую LiveData для извлечения пользовательских данных в свой ProfileFragment. Я храню переменную LiveData в ViewModel, чтобы ViewModel не возвращал новые LiveData при каждом вызове.
Однако LiveData не обновляется во второй раз, она может отображать пользовательские данные в начале, но когда пользователь отредактируйте его данные / информацию, текст профиля не обновляется, но отображается пустой текст (ничего не отображается).
Я предполагаю, что это связано с тем, что Observer никогда не получал правильного значения, но как это могло произойти?
ProfileFragment
viewModel.getUserData
вызывается onViewCreated, и каждый раз, когда пользователь завершает редактирование своих данных / информации профиля
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider.AndroidViewModelFactory(activity!!.application).create(AboutViewModel::class.java)
viewModel.getUserData()
viewModel.userDataLiveData.observe(viewLifecycleOwner, Observer {
when (it) {
is Resource.Success -> {
text_account_name.text = it.data.name
text_account_email.text = it.data.email
text_account_phone_number.text = it.data.phoneNumber
}
is Resource.Failure -> {
when (it.throwable) {
is UserDataEmptyException -> startFillDataActivity()
}
}
}
})
}
ViewModel
var userDataLiveData: LiveData<Resource<User>> = MutableLiveData()
fun getUserData() {
userDataLiveData = DatabaseRepository.getUserData(uid)
}
Репозиторий базы данных
fun getUserData(uid: String): LiveData<Resource<User>>{
val result = MutableLiveData<Resource<User>>().apply {
value = Resource.Loading()
}
userRef.child(uid).addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(p0: DataSnapshot) {
val name = p0.child(FIELD_NAME).value.toString()
val email = p0.child(FIELD_EMAIL).value.toString()
val phoneNumber = p0.child(FIELD_PHONE_NUMBER).value.toString()
val user = User(name, email, phoneNumber)
if(checkIfUserDataComplete(user)) result.value = Resource.Success(user)
else result.value = Resource.Failure(UserDataEmptyException("User have no data"))
}
override fun onCancelled(p0: DatabaseError) {
result.value = Resource.Failure(p0.toException())
}
})
return result
}