React Navigation (V2): Как предотвратить (заблокировать) открытие ящика внутри вложенной стопки? - PullRequest
0 голосов
/ 05 сентября 2018

Я создаю приложение, используя React Native, и для навигации использую React Navigation.

Чтобы иметь возможность иметь модальные и регулярные переходы карт для стека, а также меню бургера, у меня есть HomeStack, вложенное в мой MainStack, который находится внутри моего MainDrawer.

Код выглядит так:

const HomeStack = createStackNavigator({...});
const MainStack = createStackNavigator({ HomeStack, ... }, { mode: "modal" });
const MainDrawer = createDrawerNavigator({ MainStack, ... });

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

Здесь возникает проблема: Документы дают это решение , но в моем случае это не работает, так как стек вложен в другой стек.

// What I tried and what (obviously?) won't work
HomeStack.navigationOptions = ({ navigation }) => {
  let drawerLockMode = "unlocked";
  if (navigation.state.index > 0) {
    drawerLockMode = "locked-closed";
  }
  return {
    drawerLockMode
  };
};

MainStack.navigationOptions = ({ navigation }) => {
  let drawerLockMode = "unlocked";
  if (navigation.state.index > 0) {
    drawerLockMode = "locked-closed";
  }
  return {
    drawerLockMode
  };
};

Можно ли, например, узнать о состоянии дочернего стека, чтобы я мог использовать аналогичную технику для блокировки ящика?

// Example pseudo code:
MainStack.navigationOptions = ({ navigation }) => {
  let drawerLockMode = "unlocked";
  if (navigation.state.HomeStack.state.index > 0) { // here!
    drawerLockMode = "locked-closed";
  }
  return {
    drawerLockMode
  };
};

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 12 января 2019

В том же документе предусмотрена еще одна опция (рекомендуется) для перестановки стеков. Это работает, когда ящик находится в главном стеке вместе с экранами, где ящик должен быть заблокирован.

Другой вариант - добавить еще один стековый навигатор в качестве родителя для навигатора ящиков и поместить туда экран с подробностями. Это рекомендуется.

...