当前位置: 首页 > 知识库问答 >
问题:

观察onCreate片段时调用的LiveData

田鸿彩
2023-03-14
class EmergencyFragment : Fragment() {

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       emergencyFragmentViewModel = ViewModelProviders.of(this).get(EmergencyFragmentViewModel::class.java)
   }

在onViewCreated中,我设置了Observer对象,以便在LiveData中所做的任何更改都可以在这里得到更改通知:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
   super.onViewCreated(view, savedInstanceState)
   emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.observe(viewLifecycleOwner, Observer {
       Log.d("sendEmergencyEvent", "isEmergencyEventMediaLDSuccess observer called")
       }
   })
}

在ViewModel类中,我将LiveData参数设置为:

EmergencyFragmentViewModel: ViewModel() {
   var isEmergencyEventMediaLDSuccess: LiveData<Boolean> = MutableLiveData()
       private set
   private val observerEventMedia = Observer<Boolean> { (isEmergencyEventMediaLDSuccess as MutableLiveData).value = it}

在init中,我设置了一个观察者:

init {
   EmergencyFragmentModel.isEmergencyEventMediaLDSuccessModel.observeForever(observerEventMedia)
}
override fun onCleared() {
   super.onCleared()
   EmergencyFragmentModel.isEmergencyEventMediaLDSuccessModel.removeObserver(observerEventMedia)
}
class EmergencyFragmentModel {
   companion object{
       val isEmergencyEventMediaLDSuccessModel: LiveData<Boolean> = MutableLiveData()
override fun onResponse(call: Call<Int>, response: Response<Int>) {
   if(response.isSuccessful) {
       (isEmergencyEventLDModelSuccess as MutableLiveData).postValue(true)
       Log.d("succeed", "sendEmergencyEvent success: ${response.body().toString()}")
   }
override fun onStop() {
        super.onStop()
        emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObservers(viewLifecycleOwner)
        emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObserver(observeEmergencyEventLDSuccess)
    }

共有1个答案

柏正平
2023-03-14

@Pawel是对的。LiveData存储该值,每次观察它(在本例中是在您的onViewCreated中),它都会发出存储的最后一个值。

也许您想要像SingleLiveEvent这样的东西,在有人阅读它之后清理它的值。

所以当你来回的时候,它不会发出最后一个值(一旦它被清理了)。

 类似资料:
  • > 导航组件在HomeFragment中启动新的ProfileFragment。 在片段中创建ViewModel(PriceGraphFragment)。ViewModel已经被记录,并且具有多个观察者的数据只在ViewModel中初始化一次数据。 > 在onCreate()方法中创建片段的ViewModel。 使用片段的活动和子片段的父片段创建ViewModel。 null 问题可能与在pare

  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法

  • 我的应用程序包含一个ViewPager,其中包含5个片段。当片段1可见时,它还调用片段2的onCreate方法。我尝试使用、等。但我不喜欢这些在我的应用程序中的表现。 当相邻片段可见时,是否有一种方法可以禁止调用片段的onCreate?

  • 因此,我遇到的问题是,我希望在中有一个的实例,以便在活动和片段中观察它。我怎样才能做到这一点?

  • 我试图用制作一个简单的马里奥游戏。因此,我需要一个,用于杀死(Mario中的主要敌人)。经过一番研究之后,我研究了 我还创建了一个 我相信(不确定我是否完全理解了这一点)这使得成为,并且我需要多个,这意味着我将有多个的 所以我有两个问题:我对有什么不了解,以及如何让多个()在死亡时调用