我在 Kotlin 中的嵌套片段中遇到一些问题。我用 ViewModel 嵌套了片段。从后退按钮恢复片段后,再次按下 viewModel LiveData 触发器上的所有观察者,尽管我的数据没有更改。
首先,我用谷歌搜索并尝试在归档变量中定义观察者并检查它是否已初始化,然后不要再次观察它:
Lateinit var 观察者:观察者
fun method(){
if (::observer.isInitialized) return
observer = Observer{ ... }
viewModel.x_live_data.observe(viewLifecycleOwner ,observer)
}
因此,首先输入片段它工作正常,并且在恢复后它不会在没有数据更改的情况下再次触发,但它也不会在数据更改时触发!
到底是怎么回事?
LiveData
始终存储最后一个值并将其发送到每个注册的观察者。这样所有观察者都有最新的状态。
当你使用viewLifecycleOwner
,你以前的观察者已经被销毁了,所以注册一个新的观察者绝对是正确的做法 - 你需要新的观察者及其现有状态来填充返回到片段后创建的新视图(因为原始视图当 Fragment 被放入返回堆栈时被销毁)。
如果您尝试将 LiveData 用于事件(即只应处理一次的值),则 LiveData 并不是最佳 API,因为您必须创建事件包装器或类似的东西以确保它只被处理一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)