LiveData在ViewModel中存储时不起作用

问题描述 投票:0回答:3

我正在实现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。但是...

android android-livedata android-mvvm
3个回答
0
投票

MustafaKhaled,我认为这不是问题。 viewmodelfactory应该返回相同的viewmodel实例,执行时没有关系。实际上,这就是我们使用此提供程序的原因。


0
投票

[看起来,您的代码中存在问题,调用viewModel.getUserData()会更改userDataLiveData引用。因此,首先,您开始观察第一次调用时创建的实时数据。但是在下一次调用之后,您将创建另一个实时数据。而且您将更新该新实时数据的值,但是您将继续观察旧数据。


-1
投票

我想您要面对的问题是,初始化一个新的ViewModel实例。

© www.soinside.com 2019 - 2024. All rights reserved.