Навигация по очереди, пока экран не будет установлен, а затем перейдите - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь перейти к определенному экрану в моем нижнем навигаторе вкладок, когда пользователь открывает приложение, щелкнув уведомление.

Просмотр официальных документов Навигация без средства навигации , моя настройка основного навигатора выглядит следующим образом:

import {navigationRef, isReadyRef} from './root';

const MainNav = _ => {
  if (isLoading) {
    return isFirstTime ? (<OnBoarding />) : (<SplashScreen />);
  }

  return (
    <NavigationContainer
      ref={navigationRef}
      onReady={() => {isReadyRef.current = true}}>
        {!token ? <AuthNav /> : <AppNav />}
    </NavigationContainer>
  );
}

My root. js выглядит следующим образом:

import * as React from 'react';

export const isReadyRef = React.createRef();

export const navigationRef = React.createRef();

export function navigate(name, params) {
  if (isReadyRef.current && navigationRef.current) {
    // Perform navigation if the app has mounted
    navigationRef.current.navigate(name, params);
  } else {
    // You can decide what to do if the app hasn't mounted
    // You can ignore this, or add these actions to a queue you can call later
    console.log('Not mounted yet.')
  }
}

И я добавил событие OneSignal слушатель в моем root index.js следующим образом:

const App = _ => {
  useEffect(() => {
    OneSignal.addEventListener('opened', onOpened);
    
    return () => OneSignal.removeEventListener('opened', onOpened);
  }, []);

  return {
    <StoreProvider store={store}>
      <MainNav />
    </StoreProvider>
  }
}

И моя onOpened функция выглядит следующим образом:

import {navigate} from '../nav/root';

const onOpened = ({notification}) => {
  if(notification.type == 'New Request'){
    navigate('Notifications');
  }
}

Но когда я тестирую его, как ожидалось Not mounted yet. выводится на консоль. Итак, я хочу

добавить эти действия в очередь, которую вы можете вызвать позже

, как указано в официальных документах по навигации, но я не уверен, как это сделать. Я нашел response-native-queue , но он больше не поддерживается, и использование setTimeout кажется уродливым хаком, потому что время загрузки меняется. Итак, есть ли лучший подход или решение, которое я могу использовать для навигации только после завершения загрузки (я подумываю использовать для этого redux) и мои навигаторы были смонтированы (не знаю, как это сделать)?

...