android - 观察 onCreate fragment 时调用的 LiveData

标签 android kotlin mvvm android-livedata

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

为什么返回时Observe没有被删除?它应该根据 fragment 的生命周期行事。 我尝试在 onStop 上删除,但仍然调用了 observe。

更多细节: 我的每个项目 fragment 都分为3个部分:model、viewModel、view 在 View 部分,我首先设置了 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()}")
   }

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

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

最佳答案

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

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

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

关于android - 观察 onCreate fragment 时调用的 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59239874/

相关文章:

c# - 我应该在多个上下文中使用 ViewModels/模型吗?

android - Fragment.onStop() 是否保证被调用?

android - 屏幕截图代码Android的任何屏幕

android - 图库选择器在 Android 10 上返回带有文件方案的 Uri,如何读取它?

kotlin - 评估 Kotlin 中的代码块(在范围内隐藏变量)

WPF 将相同的 DataContext 分配给多个页面 MVVM

java - 检测 Android 设备震动事件的良好架构?

android - 您可以在 Jetpack Compose 中使用 TopAppBar 设置 NavController 吗?

Kotlin - 无法序列化多态类。未找到序列化器

c# - WPF DataGrid CurrentItem 为空