Как сделать модальный переключатель при использовании маршрута и навигации?

#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 в конце их запуска; так что это уже не так просто, как вернуться назад. Как это повлияет на ваш ответ?