android - 尽管数据没有改变,但一些 fragment 观察者在从返回堆栈弹出后触发

标签 android mvvm android-lifecycle android-livedata observers

我在 Kotlin 的嵌套 fragment 中遇到了一些问题。我用 ViewModel 嵌套了 fragment 。从后退按钮恢复 fragment 后,按 viewModel LiveData 上的所有观察者再次触发,尽管我的数据没有改变。

首先我用谷歌搜索并尝试在字段变量中定义观察者并检查它是否已初始化然后不再观察它:
lateinit var 观察者:观察者

fun method(){
        if (::observer.isInitialized) return
        observer = Observer{ ... }
        viewModel.x_live_data.observe(viewLifecycleOwner ,observer)
}

因此,首先进入 fragment 它工作正常,并且在恢复后它不会在没有数据更改的情况下再次触发,但它也不会在数据更改时触发!
到底是怎么回事?

最佳答案

LiveData始终存储最后一个值并将其发送给每个注册的观察者。这样所有的观察者都有最新的状态。

当您使用 viewLifecycleOwner ,您之前的 Observer 已被销毁,因此注册一个新的 Observer 绝对是正确的做法 - 您需要新的 Observer 及其现有状态来填充您返回 Fragment 后创建的新 View (因为原始 View 当 Fragment 放入后栈时被销毁)。

如果您尝试将 LiveData 用于事件(即,应该只处理一次的值),LiveData 不是最好的 API,因为您必须创建 an event wrapper或类似的东西,以确保它只被处理一次。

关于android - 尽管数据没有改变,但一些 fragment 观察者在从返回堆栈弹出后触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59205879/

相关文章:

java - 如何在 Tab 布局中设置 Tab 宽度?

android - 如何使 radioGroup 中 radioButton 的整个区域可点击?

c# - 为应用程序用户分配角色

c# - ListView 仅显示空行。 WPF MVVM

android - 当我们从 Android 的外部应用程序手动更改权限时会发生什么

android - 如何从 AbstractSavedStateViewModelFactory 动态设置包

java - 如何随机设置按钮的位置?

android - 如何在ViewModel中获取上下文

android - Activity 是由同一类、同一 Activity 的 Intent 创建的吗?

android - 如何捕捉与 RecyclerView 一起使用的 ItemTouchHelper 的 Drop Action