【发布时间】:2020-05-09 14:41:03
【问题描述】:
我正在实施 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()
}
}
}
})
}
视图模型
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
}
【问题讨论】:
-
我想是因为你使用了
addListenerForSingleValueEvent。请改用addValueEventListener。 -
@Nicolas 请注意: viewModel.getUserData 在 onViewCreated 上调用,并且每次用户完成编辑他的数据/配置文件信息时。这就是我使用单值事件的原因。
标签: android android-livedata android-mvvm