【发布时间】:2020-04-09 21:42:44
【问题描述】:
所以,我已经使用导航实现了具有多个片段模式的单个活动。我将每个片段的视图模型用于非 UI 操作。
问题是当您使用findNavController().navigate() 导航时,片段实际上并没有被销毁。仅调用 onDestroyView。因此,片段的 onDestroy 永远不会被调用,随后视图模型也不会被清除,因此 LiveData 观察者也保持活动状态,当我回到片段时,再次创建观察者,因此观察到两次实时数据。一次是它持有的旧数据,第二次是来自某些操作的新数据。
例如, 我有片段A和片段B
A 显示一个列表,B 您可以添加将显示在列表中的内容。可能会从片段 B 中的 api 获取新数据以显示在 A 中。
所以,当我从片段 B 回到 A 时,观察者会先用旧数据调用两次,然后再用更新的数据调用。最后,列表显示了正确的数据,但我不希望有两个观察者发生。
我关注了这篇文章 https://medium.com/@BladeCoder/architecture-components-pitfalls-part-1-9300dd969808
并尝试使用viewLifeCycleOwner 而不是this,但这无济于事,问题仍然存在。
我也尝试在观察之前移除观察者:
vm.ld.removeObservers(this)
vm.ld.observe(viewLifeCyclerOwner, observer)
问题依然存在。
(我也尝试删除onDestroyView 中的观察者,但问题仍然存在。)
我发现的唯一解决方法是在onDestroyView 中手动调用视图模型onCleared 并清除实时数据。
在片段 onDestroyView
vm.clear()
在视图模型中
fun clear() = onCleared()
override fun onCleared() {
//do stuff
}
现在,这解决了我的问题。但我觉得这不是一个可靠的解决方案,可以有更好的方法来做到这一点。如果有人能阐明这一点,我会很高兴。谢谢。
【问题讨论】:
-
兄弟你有解决办法吗?因为我有同样的问题
-
你可以试试我上面用过的解决方案。但请注意,这不是最佳解决方案。
标签: android android-fragments navigation android-livedata android-viewmodel