【问题标题】:Observe LiveData called when onCreate fragment观察 onCreate 片段时调用的 LiveData
【发布时间】:2020-04-02 00:36:05
【问题描述】:

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

为什么回退时观察没有被删除?它应该根据片段的生命周期运行。 我尝试在 onStop 上删除,但仍然调用了观察。

更多细节: 我的每个项目片段分为 3 个部分:模型、视图模型、视图 在视图部分,我首先设置了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()}")
   }

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

override fun onStop() {
        super.onStop()
        emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObservers(viewLifecycleOwner)
        emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObserver(observeEmergencyEventLDSuccess)
    }

【问题讨论】:

  • 如果你回到片段,它的视图被重新创建,并且新的观察者也被创建。然后该观察者被“提升”到 LiveData 的当前状态/值 - 这是设计使然。

标签: android kotlin mvvm android-livedata


【解决方案1】:

据我了解您的问题,您只想在新值与旧值不同时运行观察者。这可以通过将值保留在 viewModel 的另一个变量中来完成。

    if (newValue == viewModel.retainedValue) return@observe
    viewModel.retainedValue = newValue

【讨论】:

    【解决方案2】:

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

    也许你想要像SingleLiveEvent 这样的东西,它会在有人阅读后清除它的值。

    因此,当您来回移动时,它不会发出最后一个值(一旦被清理)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多