我在ViewModel中有一个函数'A',该函数从firebase检索数据,并将该值分配给MutableLiveData<Int>
(所有这些都包装在onSuccessListener
中)并返回它。此函数是从同一ViewModel中的另一个函数“ B”调用的。但是,当我尝试从“ A”返回MutableLiveData<Int>
时,它将返回为0(默认值)。但是,如果我在onSuccessListener之外为MutableLiveData<Int>
分配值,则将返回该值。
代码:
val num = MutableLiveData<Int>().default(0)
private fun A():Int {
FirebaseOperation
.addOnSuccessListener{ //it:DocumentSnapshot!
num.value = it.num
}
return num.value.toInt() // outside onsuccesslistener, default value 0 is being returned
}
private fun B() {
val num2 = A()
}
从firebase检索数据是异步发生的,换句话说,仅当从firebase中检索数据时才调用addOnSuccessListener
回调。因此,仅在调用回调时才更新实时数据。当您从A()
调用B()
时,它返回0,因为它不等待实时数据更新(调用回调),而仅返回默认值。
当您简单地更新addOnSuccessListener
之外的实时数据值时,它会同步更新,因此您会获得更新的结果
LiveData
的主要目的是在异步工作之后进行更新并予以遵守。在函数A()
中,我看到您仅添加了SuccessListener
,但未执行任何操作,因此未调用SuccessListener
。在函数B()
中,您只检索了对MutableLiveData
的引用,但没有观察到,因此它始终包含默认值。通常在LiveData
或Activity
中观察到Fragment
对象:
num.observe(lifecycleOwner, androidx.lifecycle.Observer {
// here you retrieve changes of your "num" variable as parameter "it"
})
其中lifecycleOwner
-通常是活动或片段。