Компонент навигации 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);
}