Ручка назад нажата на фрагмент, затем продолжайте навигацию

#android #kotlin

Вопрос:

Я слушаю назад кнопку, нажатую на моем фрагменте следующим образом

 val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    podcastViewModel.removePodcast();
    // THEN - continue navigating 
}
 

Как я могу выполнить такую задачу, как removePodcast(); затем, после продолжения навигации назад. Приведенный выше код перехвата кнопки «Назад» нажат, но не продолжается

Ответ №1:

Вы отменяете обычное поведение при нажатии назад, поэтому оно не возвращается. Вам нужно позвонить parentFragmentManager.popBackStack() (или findNavController().popBackStack() если вы используете навигационный компонент).

Другой вариант-выполнить обратный вызов setEnabled = false после удаления подкаста (это означает, что обработчик не будет вызван в следующий раз), а затем немедленно запустить событие с обратным нажатием activity?.onBackPressed() . Это будет работать с поведением по умолчанию (если вы не добавили больше диспетчеров! В этом случае он перейдет к следующему)


редактировать: Я сам использовал этот popBackStack материал, но, возможно, было бы лучше использовать подход «отключить диспетчера и повторно запустить» в целом. Просто потому, что стандартное поведение может измениться (многое происходит с обратными стеками и разработкой навигации), поэтому жесткое кодирование popBackStack вызова может привести к проблемам в будущем.

Я не знаю, какова официальная линия, хотя — в документах есть что сказать:

Изменение включенного состояния на OnBackPressedCallback настоятельно рекомендуется для временных изменений, поскольку оно поддерживает порядок, описанный выше, что особенно важно, если у вас есть обратные вызовы, зарегистрированные у нескольких разных владельцев вложенного жизненного цикла.

но это больше связано с временным изменением реакции на нажатие назад, а не с обработкой одного нажатия и возней, запуском нескольких событий для создания определенного стандартного поведения

Ответ №2:

Просто нашел способ! Обратный вызов должен быть отключен или удален

 val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    podcastViewModel.removePodcast();
    this.remove()
    activity?.onBackPressed()
}