Как перейти к экрану другого стека, используя глубокие ссылки в response-navigation v5? - PullRequest
1 голос
/ 18 февраля 2020

В этом случае экран можно открыть с помощью глубоких ссылок. Есть компонент <BackButton />, и я sh поведую кнопку следующим образом:

  • , если этот экран был открыт с помощью navigator.navigate, тогда go back.
  • , если этот экран был открыт с помощью глубоких ссылок, затем go на главный экран.

Структура навигатора, подобная этой

  • Root (навигатор стека)
    • Вкладка (нижняя вкладка навигатора)
      • Домашняя страница
      • Личная информация
    • Главная (навигатор стека)
      • Магазин

Вначале я написал такой код:

const onBackButtonPress = useCallback(() => {
  if (navigation.canGoBack()) {
    navigation.goBack()
  } else {
    navigation.navigate('Tab', { screen: 'Home' })
  }
), [navigation])

Этот код работает, однако использование функции navigation.navigate() вызывает эффект pu sh (новый экран появляется с правого края), а не go back (новый экран появляется с левого края).

Затем я попытался использовать navigation.replace() и navigation.reset()

navigation.reset({
  index: 0,
  routes: [{ name: 'Tab', state: { routes: [{ name: 'Home' }, { name: 'Personal' }] } }],
})

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

Что я могу сделать, чтобы исправить поведение навигации?

1 Ответ

0 голосов
/ 18 февраля 2020

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

Возможно, в отличие от navigate, в этом случае navigation не может обработать этот маршрут при использовании replace и reset, поэтому я пытаюсь использовать его родительский навигатор, и это именно то поведение, которое я хотел!


const onBackButtonPress = useCallback(() => {
  if (navigation.canGoBack()) {
    navigation.goBack()
  } else {
    const parentNaigator = navigation.dangerouslyGetParent()
    parentNaigator?.replace('Tab', { screen: 'Home' })
  }
), [navigation])

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

...