React Native: для ключа не определен маршрут X Должен быть один из Y Z

Я работаю над приложением со следующей структурой маршрутизации:

root // tab navigator
  A // stack navigator
    A1
    A2 -> B
  B // stack navigator
    B1
    B2
    B3 -> C
  C

Корневая навигация состоит из навигатора вкладок. Два маршрута на этой вкладке навигатора (A и B) содержат навигаторы стека.

Я пытаюсь сделать так, чтобы всякий раз, когда пользователи нажимают вкладку B, стек B сбрасывается, поэтому пользователю всегда предоставляется B1, когда стек B монтируется.

Я думал, что смогу добиться этого, добавив следующее событие к значку, который пользователи щелкают, чтобы перейти к B (мой компонент вкладки настраивается):

this.props.navigation.dispatch(StackActions.reset({
  index: 0,
  key: null,
  actions: [NavigationActions.navigate({ routeName: 'B' })],
}));

Однако это бросает:

Error: There is no route defined for key B.
Must be one of: 'A','A1','A2'

Это меня сбивает с толку. Кто-нибудь знает, как я могу программно принудительно сбросить стек B до 0? Любые предложения будут полезны!

// versions:
"react-navigation": "^4.0.10",
"react-navigation-stack": "^1.9.4",
"react-navigation-tabs": "^2.5.6",

person duhaime    schedule 05.11.2019    source источник


Ответы (3)


Возможно, это связано с настройкой сборки, я бы получил это в expo, хотя у меня явно был определен маршрут, и казалось, что он перезагружает js. Остановка запуска выставки вызвала более полную сборку, и новые маршруты вступили в силу.

person edencorbin    schedule 19.07.2020
comment
Здесь без выставок пришлось сделать то же самое, перезагрузить - person pmiranda; 17.09.2020
comment
Согласен, даже в вытянутых проектах перезагрузка не работает. Мне пришлось перестроить приложение, чтобы отразить изменения. - person KeshavDulal; 28.09.2020

Это отрывочно, но мне удалось запустить это, сохранив маршрутизатор B в глобальном пространстве имен:

const BStack = createStackNavigator(
  {
    B1: { screen: B1, },
    B2: { screen: B2, },
    B3: { screen: B3, },
  },
  { 
    initialRouteName: 'B1',
  }
)

BStack.navigationOptions = ({navigation}) => {
  global.B_NAVIGATOR = navigation; // could be stored in redux or elsewhere...
}

Затем в моем навигаторе вкладок корневого уровня я прислушивался, чтобы услышать, щелкнул ли пользователь вкладку B. Если это так, я просто сбрасываю навигатор стека B с помощью .popToTop():

class Tab extends React.Component {
  constructor(props) {
    super(props)
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick() {
    if (global.B_NAVIGATOR) global.B_NAVIGATOR.popToTop();
    this.props.navigation.navigate('B', {});
  }

  render() {
    return (
      <TouchableOpacity onPress={this.handleClick}>
        <Text>Link to B</Text>
      </TouchableOpacity>
    )
  }
}
person duhaime    schedule 05.11.2019

Я получил это после того, как удалил StackNavigator и не перезапустил приложение полностью. Мое решение заключалось в том, чтобы остановить приложение и запустить expo start -c, который очищает кеш при запуске.

person teewuane    schedule 26.08.2020