почему onCleared в моем viewModel вызывается, когда я закрываю фрагмент, используя компонент навигации? - PullRequest
0 голосов
/ 22 марта 2020

Я пытался прочитать это , но я думаю, что не могу найти решение.

говорят, что у меня есть FragmentA и Fragment B. Я перехожу к фрагменту B, используя этот код

val nextDestination = AFragmentDirections.actionToB()
findNavController().navigate(nextDestination)

когда я возвращаюсь от фрагмента B к фрагменту A, в моем фрагменте вызывается onDestroy, а затем вызывается onCleared на моей ViewModel.

но когда я поворачиваю телефон ( изменения конфигурации), когда вызывается onDestroy, то onCleared НЕ вызывается.

поэтому я ранее предположил, что когда onDestroy вызывается, то также вызывается onCleared. но это не так. почему такое поведение отличается? когда изменения конфигурации отличаются от навигации по фрагментам?

Я запутался, когда именно onCleared называется

1 Ответ

0 голосов
/ 22 марта 2020

Весь смысл ViewModel состоит в том, чтобы пережить изменения конфигурации в соответствии с документацией ViewModel , поэтому ожидается, что ViewModel не очищаются при изменении конфигурации.

Однако каждая ViewModel ассоциируется с ViewModelStoreOwner. Это может быть ваша деятельность или фрагмент. Это ViewModelStoreOwner, чтобы понять, когда он уничтожается из-за временного изменения (такого как изменение конфигурации) или постоянного уничтожения. Только в этом постоянном уничтожении вызывается onCleared() для каждой модели представления.

Для действия это постоянное уничтожение происходит по окончании действия (т. Е. Вызывается finish() или поведение onBackPressed() приводит к вызову finish().

Для Фрагмента это постоянное уничтожение происходит , когда Фрагмент выталкивается из заднего стека. Это то, что происходит, когда вы извлекаете фрагмент B из задний стек и возврат к Фрагменту A - Фрагмент B удаляется из FragmentManager, проходит через onDestroy(), и его ViewModels очищаются. выталкивается из заднего стека или, если это единственное в заднем стеке, когда действие заканчивается, когда вы нажимаете кнопку возврата системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...