尽管数据没有改变,但一些片段观察者在从后堆栈弹出后触发

Ken*_*nji 9 android observers mvvm android-lifecycle android-livedata

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

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

fun method(){
        if (::observer.isInitialized) return
        observer = Observer{ ... }
        viewModel.x_live_data.observe(viewLifecycleOwner ,observer)
}
Run Code Online (Sandbox Code Playgroud)

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

ian*_*ake 11

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

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

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

  • 奇怪的是,在恢复片段上没有任何更改数据的情况下,所有观察者都再次触发。 (2认同)