观察onCreate片段时调用LiveData

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

简而言之:当Observe处于活动状态时,当我通知时它可以正常工作,但是当我返回上一个片段(我使用导航组件)并再次导航到当前片段时,就会创建该片段,并且由于某种原因调用了“观察”。

为什么回退时不删除观测?它应根据片段的生命周期运行。我试着在onStop上删除,仍然观察到了。

更多详细信息:我的每个项目片段都分为3部分:模型,viewModel,视图在视图部分,我首先设置viewModel。

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 {
   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()}")
   }

有人可以说我想念的吗?为什么当有活动的观察者并且我回到上一个片段(我使用导航组件)并再次导航到当前片段时,调用了观察者?我可以理解,当创建ViewModel实例并为LiveData参数执行setValue时,便会收到通知。但是,为什么我回去时观察物没有移走?我尝试删除onStop上的Observ,并且一直在发生。

override fun onStop() {
        super.onStop()
        emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObservers(viewLifecycleOwner)
        emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObserver(observeEmergencyEventLDSuccess)
    }
android kotlin mvvm android-livedata
1个回答
0
投票

@@ Pawel是正确的。 LiveData存储该值,每次您观察它时(在这种情况下,在onViewCreated中),它将为您提供最后存储的值。

也许您想要类似SingleLiveEvent之类的东西,它会在有人读取后清除其值。

这里是SingleLiveEvent的更新版本,已修复了一些错误:https://github.com/hadilq/LiveEvent/blob/master/lib/src/main/java/com/hadilq/liveevent/LiveEvent.kt

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