#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' }],
});