我正在实现LiveData,以将用户数据提取到我的ProfileFragment。我将LiveData变量存储在ViewModel中,以便ViewModel不会在每次调用时都返回新的LiveData。
但是,LiveData第二次不更新,它可以在开始显示用户数据,但是当用户编辑其数据/信息时,配置文件文本不会更新,而是显示空白文本(不显示任何内容)。] >
我认为这是由于观察者从未收到正确的值,但是这怎么可能发生?
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) }
DatabaseRepository
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
}
我正在实现LiveData,以将用户数据提取到我的ProfileFragment。我将LiveData变量存储在ViewModel中,以便ViewModel不会在每次调用时都返回新的LiveData。但是...
MustafaKhaled,我认为这不是问题。 viewmodelfactory应该返回相同的viewmodel实例,执行时没有关系。实际上,这就是我们使用此提供程序的原因。
[看起来,您的代码中存在问题,调用viewModel.getUserData()会更改userDataLiveData引用。因此,首先,您开始观察第一次调用时创建的实时数据。但是在下一次调用之后,您将创建另一个实时数据。而且您将更新该新实时数据的值,但是您将继续观察旧数据。
我想您要面对的问题是,初始化一个新的ViewModel实例。