Как обрабатывать неинициализированную навигационную ссылку в React Navigation v4?

#reactjs #react-native #react-navigation

#reactjs #react-native #реакция-навигация

Вопрос:

Контекст: я использую версию 4 навигации React. У меня есть <PushNotificationHandler /> и <DynamicLinksHandler /> это за пределами моих навигаторов. Эти компоненты используют для навигации NavigationService с ref помощью createAppContainer предоставленного from,.

В версии 5 у вас есть onReady поддержка, позволяющая проверить, готово ли приложение к навигации для использования вашим NavigationService, чтобы избежать сбоев приложения (см. Документы по обработке инициализации). Но в v4 у него нет такой поддержки, и я не знаю, как избежать навигаций, которые происходят до того, как навигаторы приложений смонтируются, т. Е. В компоненте DynamicLinks или PushNotification. Есть какие-нибудь предложения?

документы v5: https://reactnavigation.org/docs/navigating-without-navigation-prop/#handling-initialization

документы v4: https://reactnavigation.org/docs/4.x/navigating-without-navigation-prop/#handling-initialization

NavigationService:

 import { NavigationActions, StackActions } from 'react-navigation'

export default class NavigationService {
  static navigator

  static initialize(navigatorRef) {
    NavigationService.navigator = navigatorRef
  }

  static isNavigatorDefined() {
    // App hasn't mounted so don't navigate
    if (!NavigationService.navigator) {
      // TODO: We need to push these navigations into a queue and navigate once the app mounts
      console.error('NavigationService.navigator is undefined')
      return false
    }
    return true
  }

  static navigate(routeName, params) {
    if (!NavigationService.isNavigatorDefined()) {
      return
    }

    // Perform navigation if the app has mounted
    NavigationService.navigator.dispatch(
      NavigationActions.navigate({
        routeName,
        params,
      })
    )
  }
...
}
  

AppMain:

 ...

const AppMain = () => {
  ...
  return (
    <>
      <DynamicLinksHandler />
      <PushNotificationHandler />
      <AppNavigator
        ref={(navigatorRef) => NavigationService.initialize(navigatorRef)}
        onNavigationStateChange={() => handleNavigationStateChange}
      />
    </>
  )
}

export default AppMain
  

DynamicLinksHandler (фрагмент):

 ...
// In a listener for dynamic links
NavigationService.navigate('GroupHome', {
          group: {
            id: groupId,
          },
        })
...
  

Ответ №1:

Вы можете передать ссылку ‘navigatorRef’ другим компонентам, и если !ref.current, ссылка не готова. Я делаю это с некоторым svg, чтобы манипулировать dom svg. При первом отображении ссылка.current равна нулю, поэтому верните. При втором рендеринге ссылка установлена, так что продолжайте. Вы также можете создать const isReady = ref.current ? true : false и выполните {if (isReady amp;amp; <PushNotificationHandler …/>