Jetpack Compose проблемы popBackStack с анимированными переходами навигации

При использовании новой навигации Compose, которая по умолчанию включает анимацию в NavHost, я столкнулся с несколькими проблемами с navController.popBackStack(). (Редактирование 2: навигационная версия 2.8.0-beta03)

2 основных вопроса были:

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

Мне удалось решить обе проблемы, проверив жизненный цикл навигации перед вызовом popBackStack() с помощью приведенного ниже кода:

if (navController.currentBackStackEntry?.lifecycle?.currentState == Lifecycle.State.RESUMED) {
    navController.popBackStack()
}

Теперь все работает, за исключением того, что теперь я не могу вызвать popBackStack() до завершения анимации, что приводит к некоторому неуклюжему поведению, когда пользователи не могут вернуться назад в течение 700-1000 мс из-за того, что жизненный цикл не находится в состоянии ВОЗОБНОВЛЕНИЕ сразу после отображения экрана (из-за анимация кроссфейда по умолчанию длительностью около 700 мс по умолчанию)

Я проверил, как ведет себя системная кнопка «Назад» в этом сценарии, и я никогда не сталкивался ни с одной из двух проблем, перечисленных выше, более того, я могу вернуться назад сразу после перехода вперед, без необходимости ждать ВОЗОБНОВЛЕНИЯ жизненного цикла без каких-либо проблем, перечисленных выше. .

Я проверил реализацию NavHost, и единственное, что они делают, это реализуют BackHandler, в котором есть navController.popBackStack(), поэтому мне интересно, является ли исправление, которое я сделал, правильным способом извлечения стека.

Я хотел бы, чтобы мои кнопки «Назад» вели себя так же, как системные нажатия, без удаления анимации навигации по умолчанию.

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

Редактировать 1: Чтобы дать больше контекста второй проблеме, поскольку она более серьезная, я привожу ее изображение ниже:

Мой задний стек:

ScreenA -> ScreenB -> ScreenC -> ScreenD

тогда я сделаю navController.popBackStack()

Тогда мой задний стек становится:

ScreenA -> ScreenB -> ScreenC (-> ScreenD still partially visible)

Обычно экран D белый с заголовком «Экран D» вверху по центру, а экран C желтый с заголовком «Экран C» посередине. При вызове navController.popBackStack() до завершения анимации плавного перехода от C к D экран D выталкивается из заднего стека, но остается на экране и из-за альфа-перехода он перекрывается с фактическим текущим экраном, то есть экраном C.

Попробуйте navController.navigateUp()?

Code Poet 20.06.2024 12:14

Уже сделал, это решает первую проблему, но не решает вторую.

Vicked Vuljo 20.06.2024 14:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне хотелось бы знать, какую версию создания навигации вы используете. Если вы используете новую версию создания типовой навигации: 2.8.0-beta03 или 2.8.0-beta01 или версию, которая 2.8.0-alpha08 вводит Safe Args в Navigation Compose, в этой версии есть какая-то странная ошибка в самой библиотеке, особенно в выталкивание стека.

Если мы используем navController.popBackStack или navController.navigateUp для возврата к предыдущему экрану, он иногда возвращается, а иногда не просто зависает.

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

Я уже сообщал об этой ошибке в трекере ошибок, кстати, не только я, но и многие другие. См.: https://issuetracker.google.com/issues/347114499

Я действительно был в версии 2.8.0-beta03, тестируя новую безопасную навигацию по типам, я проверил журнал изменений и, кроме навигации по сохранению типов и некоторых изменений безопасных аргументов, я не увидел ничего, связанного с самим обратным стеком, поэтому я не думал, что новая версия оказало на это влияние... я откатился на 2.7.7, и все работает как задумано. думаю, мне придется немного подождать с типобезопасной навигацией :D спасибо за предупреждение об ошибках с обратным стеком в версиях 2.8.0+

Vicked Vuljo 20.06.2024 21:33

Другие вопросы по теме