Компонент навигации Android выполняет действие при возврате обратно в стек
Я использую компонент навигации Android и, несмотря на некоторые проблемы с прорезыванием зубов, теперь он работает хорошо.
Я придерживаюсь одного принципа создания множества фрагментов и использую модели общего представления для связи между фрагментами.
Теперь у меня есть сценарий в моем приложении, где пользователь создает что-то, сохраняет его и возвращается к основному фрагменту списка (подумайте, что-то вроде добавления нового контакта, за исключением того, что он включает в себя гораздо больше, чем просто ввод в некоторых полях)
Когда пользователь сохраняет информацию, мне нужно очистить данные из моих моделей представлений (это связано с проблемами безопасности, а не с производительностью), поскольку они являются общими моделями представлений и поэтому привязаны к жизненному циклу активности, а не к фрагменту, поэтому они выиграли ". Я не могу очистить себя, я могу добиться этого в обычном потоке, просто установив данные в null и вызвав navcontroller.popBackStack(), но если пользователь отжимается назад, у меня нет возможности узнать, и, следовательно, я не могу очистить эти модели представлений, есть идеи?
1 ответ
Вы можете реализовать интерфейс слушателя (скажем, OnBackPressedListener) и использовать его в своих соответствующих фрагментах для выполнения действий при нажатии кнопок "назад" (или навигации вверх). Интерфейс будет вашим мостом между вашими фрагментами и деятельностью.
Правильный способ сделать это, я не думаю, был доступен в то время, но вы должны ограничить свои модели представления навигационными графиками, таким образом данные очищаются системой, и вы обрабатываете только навигацию, быстрый пример:
private ViewModelStoreOwner getStoreOwner() {
NavController navController = Navigation
.findNavController(requireActivity(), R.id.root_navigator_fragment);
return navController.getViewModelStoreOwner(R.id.root_navigator);
}
private void setUpSearchViewModel() {
searchViewModel = new ViewModelProvider(getStoreOwner()).get(SearchViewModel.class);
}