Сброс StackNavigator из компонента

#react-native #react-navigation #react-navigation-stack

#react-native #react-навигация #реагировать-навигация-стек

Вопрос:

ОБЩАЯ ПРОБЛЕМА (для людей, ищущих одно и то же решение):

У меня есть приложение с StackNavigator на основе коммутатора («MainStack»). Я хотел бы сбросить MainStack как {index: 1, routes: [{name: ‘Home’, name: ‘NestedStack’}]}, и я хотел бы вызвать это из компонента MainStack (см. Ниже)

 function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        {
           anon ?
           <Stack.Screen name="Auth" component={AuthScreen} />
           <Stack.Screen name="MainStack" component={MainStackScreen} />
        }
      </Stack.Navigator>
    </NavigationContainer>
  );
}

const MainStack = createStackNavigator();

function MainStackScreen({navigation, route}) {

  
  *** An event occurs here ***
  *** And I'd like to respond to the event with a navigation.reset() ***

  return (
    <MainStack.Navigator>
      <MainStack.Screen name="Home" component={Home} />
      <MainStack.Screen name="NestedStack" component={NestedStackScreen} />
    </MainStack.Navigator>
  );
}
  

Я пробовал несколько различных комбинаций navigation.dispatch({…CommonActions.reset({}), target}), что приводило к различным ошибкам от несуществующего экрана до проблем с screens.options.

Я также был бы очень признателен за совет о том, как указать, с какого экрана начинать для NestedStack… будет ли это просто {name: ‘NestedStack’, screen: ‘NestedScreen’} ??

КОНКРЕТНЫЙ ВАРИАНТ ИСПОЛЬЗОВАНИЯ: чего я действительно пытаюсь добиться, так это связывания. У меня есть пользователи, открывающие ссылки, когда приложение закрыто (к которому я обращаюсь через Linking.getInitialURL) и с экранов камер в приложении (которые я слушаю через Linking.addEventListener). Я поместил оба из них в компонент MainStack для перехвата ссылок, когда приложение переключается из потока авторизации и когда QR-код сканируется в приложении.

Я должен прослушать изменения в маршруте MainStackScreen, затем установить для переменной isNavigatorMounted значение true, как только маршрут будет полностью смонтирован, а затем это запускает мою проверку Linking.getInitialURL.

Пожалуйста, ответьте на общий вопрос для обычных пользователей StackOverflow, но если это ужасно неэффективный метод, пожалуйста, дайте мне знать.

Ответ №1:

Этот ответ был предоставлен https://discord.com/channels/102860784329052160/288388742929055765/770038660220715028

Вам не нужны CommonActions или что-то еще. Просто примените следующее к объекту навигации StackNavigator:

 navigation.reset({
    routes: [{ name: 'Home' }, { name: 'NestedStack' }],
});