在函数之间传递MutableLiveData

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

我在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()
}
android kotlin android-livedata android-viewmodel mutablelivedata
2个回答
0
投票

从firebase检索数据是异步发生的,换句话说,仅当从firebase中检索数据时才调用addOnSuccessListener回调。因此,仅在调用回调时才更新实时数据。当您从A()调用B()时,它返回0,因为它不等待实时数据更新(调用回调),而仅返回默认值。

当您简单地更新addOnSuccessListener之外的实时数据值时,它会同步更新,因此您会获得更新的结果


0
投票

LiveData的主要目的是在异步工作之后进行更新并予以遵守。在函数A()中,我看到您仅添加了SuccessListener,但未执行任何操作,因此未调用SuccessListener。在函数B()中,您只检索了对MutableLiveData的引用,但没有观察到,因此它始终包含默认值。通常在LiveDataActivity中观察到Fragment对象:

num.observe(lifecycleOwner, androidx.lifecycle.Observer {
    // here you retrieve changes of your "num" variable as parameter "it"
})

其中lifecycleOwner-通常是活动或片段。

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