我在 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/