Итак, я реализовал одно действие с шаблоном нескольких фрагментов с помощью навигации. Я использовал модель просмотра для каждого фрагмента для операций, отличных от пользовательского интерфейса.
Проблема в том, что когда вы перемещаетесь с помощью findNavController().navigate()
, фрагмент фактически не уничтожается. Вызывается только onDestroyView
. Таким образом, onDestroy фрагмента никогда не вызывается, и впоследствии модель просмотра не очищается, поэтому наблюдатель LiveData также остается живым, и когда я возвращаюсь к фрагменту, наблюдатель создается снова, и поэтому живые данные наблюдаются дважды. Один раз со старыми данными, которые он хранит, а второй - с новыми данными из некоторых операций.
Например, у меня есть фрагмент A и фрагмент B
A показывает список, а B вы можете добавить то, что будет отображаться в списке. возможно получение новых данных из API во фрагменте B для отображения в 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
, но проблема осталась.)
Единственное, что я нашел, - это вручную вызвать модель просмотра onCleared
в onDestroyView
и очистить живые данные.
Во фрагменте onDestroyView
vm.clear()
В режиме просмотра
fun clear() = onCleared()
override fun onCleared() {
//do stuff
}
Теперь это решает мою проблему. Но я считаю, что это не надежное решение, и может быть лучший способ сделать это. Буду рад, если кто-нибудь сможет пролить свет на это. Спасибо.