Reactjs React Native:没有为键X定义路由必须是Y或Z之一

Reactjs React Native:没有为键X定义路由必须是Y或Z之一,reactjs,react-native,react-navigation,react-navigation-stack,Reactjs,React Native,React Navigation,React Navigation Stack,我正在开发具有以下路由结构的应用程序: root // tab navigator A // stack navigator A1 A2 -> B B // stack navigator B1 B2 B3 -> C C 根导航由选项卡导航器组成。该选项卡导航器A和B上的两条路由包含堆栈导航器 我试图让它,每当用户点击B标签,B堆栈复位,所以用户总是服务B1时,B堆栈挂载 我想我可以通过将以下事件添加到用户单击以导航到“我的选项卡

我正在开发具有以下路由结构的应用程序:

root // tab navigator
  A // stack navigator
    A1
    A2 -> B
  B // stack navigator
    B1
    B2
    B3 -> C
  C
根导航由选项卡导航器组成。该选项卡导航器A和B上的两条路由包含堆栈导航器

我试图让它,每当用户点击B标签,B堆栈复位,所以用户总是服务B1时,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",

这很粗略,但我可以通过将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选项卡。如果是这样,我只需使用.poptoop重置B堆栈导航器:


这很粗略,但我可以通过将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选项卡。如果是这样,我只需使用.poptoop重置B堆栈导航器:


这可能与构建设置有关,我会在expo中得到这一点,尽管我已经明确定义了路线,并且它似乎重新加载了js。停止启动expo会触发一个更完整的构建,新的路由将生效。

这可能与构建设置有关,我会在expo中得到它,尽管我已经明确定义了路由,并且它似乎会重新加载js。停止启动expo会触发一个更完整的构建,新路线将生效。

我是在移除StackNavigator并没有完全重新启动应用程序后得到这个消息的。我的解决方案是停止应用程序并运行expo start-c,它会在启动时清除一些缓存。

我是在移除StackNavigator并没有完全重新启动应用程序后得到的。我的解决方案是停止应用程序并运行expo start-c,它会在启动时清除一些缓存。

相关:相关:在没有expo的情况下,必须执行相同的操作,重新启动,即使在弹出的项目中,重新加载似乎也不起作用。我不得不重新构建应用程序以反映这些变化。在这里,没有expo,我也必须这样做,重新启动,即使在弹出的项目中,重新加载似乎也不起作用。我不得不重新构建应用程序以反映这些变化。