#javascript #react-native #react-navigation
#javascript #react-native #реакция-навигация
Вопрос:
У меня есть четыре страницы: «ReadyScreen», «RunningScreen», «ListScreen» и «CheckScreen»
Чтобы начать выполнение, пользователь переходит от «ReadyScreen» к «ListScreen» к «CheckScreen» и, наконец, к «RunningScreen»
ReadyScreen -> ListScreen -> CheckScreen -> RunningScreen
В конце выполнения пользователя они переходят обратно в «ReadyScreen» из «RunningScreen»
Я хочу, чтобы модал переключался с их информацией о ходе выполнения, когда пользователь переходит с RunningScreen на ReadyScreen. Мне сказали, что я могу сделать это с помощью маршрута, но у меня возникли проблемы с его правильной настройкой. Вот что у меня есть до сих пор:
function RunningScreen({navigation, route}){
const checkFinish = () => {
onPress: () => navigation.navigate('ReadyScreen, {
didComeFromRunningScreen: true
})
}
…
useFocusEffect(
React.useCallback(()=>{
....
if(didComeFromRunningScreen){
toggleModal()
}
}, [])
}
Я также застрял на том, как переключить это на экране ReadyScreen
Ответ №1:
Если вы возвращаетесь к предыдущему экрану, вы не можете передавать такие параметры. или, если вы принудительно нажмете на предыдущий экран, чтобы снова открыть его, он создаст новый стек. Вы должны передать функцию обратного вызова с экрана готовности на экран запуска, а на рабочем экране, когда вы нажмете кнопку завершения, вы вызовете свою функцию обратного вызова.
Вот пример кода:
Готовый экран
const ReadyScreen = ({ navigation }) => {
const toggleModal = () => {
// Your modal method to open modal
};
// callback func
const openModalCallBack = () => {
toggleModal();
};
const gotoRunningScreen = () => {
navigation.navigate("RunningScreen", { openModalCB: openModalCallBack }); // passing callback func
};
return (
<View>
<Button onPress={gotoRunningScreen} />
</View>
);
};
export default ReadyScreen;
Экран запуска
const RunningScreen = ({ navigation, route }) => {
const checkFinish = () => {
const { openModalCB } = route?.params;
openModalCB(); // Here you calling the callback func
navigation.goBack(); // or pop()
};
return (
<View>
<Button onPress={checkFinish} />
</View>
);
};
export default RunningScreen;
Комментарии:
1. Итак, в общем, мне не разрешено просто принудительно возвращаться к экрану в любом приложении? Чтобы уточнить, у меня есть оба этих экрана, существующие в навигаторе стека.
2. В принципе, если вы используете метод simple navigation.GoBack(), он просто вернет вас к предыдущему экрану, но в этом случае нет возможности передавать параметры на предыдущий экран. Более того, если вы используете navigation.navigate(«ReadyScreen»,{your params}) на своем рабочем экране, а ваш readyscreen уже находится в стеке, тогда он будет просто запускаться как GoBack(), но не передавать параметры, потому что он уже находится в стеке. и если вы используете метод push (), он откроет экран готовности, но он будет верхним на вашем рабочем экране (без перехода назад). Вот почему простой выход — передать функцию обратного вызова и вызвать ее
3. Хорошо, я очень сожалею об изменении, но чтобы все было менее загроможденным, теперь фактически есть два экрана между RunningScreen и ReadyScreen, которые называются: ListScreen и CheckScreen . Путь StackNavigation теперь выглядит следующим образом: ReadyScreen -> ListScreen -> CheckScreen -> RunningScreen Пользователь все равно будет перемещаться с RunningScreen на ReadyScreen в конце их запуска; так что это уже не так просто, как вернуться назад. Как это повлияет на ваш ответ?