【问题标题】:How to persist stacked screens when switching between tabs in React Native Navigation在 React Native Navigation 中的选项卡之间切换时如何保持堆叠的屏幕
【发布时间】:2020-01-23 10:40:20
【问题描述】:

我正在使用使用createBottomTabNavigator() 创建的底部标签导航器并将其传递给几个屏幕,每个屏幕都包含自己的堆栈导航:

const tabNavigator = createBottomTabNavigator({
    TradingStack,
    LendingStack,
    FinanceStack,
    AccountBalancesStack,
    OtherStack,
  },
  {
    tabBarComponent: props => (
      <NavigationFooter />
    )
  }
);

我将我自己的自定义底部导航器组件传递给它,称为&lt;NavigationFooter /&gt;。当tabBarComponent 被省略时,将使用一个内置的底部标签导航器,但是我需要比这个内置解决方案提供的更多功能。问题是,当使用我的自定义标签栏时,我在各个屏幕中失去了堆栈持久性。澄清一下,假设我的TradingStack 屏幕有几个堆叠在上面的屏幕,我打开其中一个。使用默认标签栏时,如果我切换到LendingStack 屏幕,然后再切换回TradingStack,我仍然会在被推到根TradingStack 屏幕顶部的堆叠屏幕上。

但是,当使用我的自定义标签栏组件时,在这些标签/屏幕之间移动总是会将我带到每个标签的根目录,而不是让我回到标签所在的堆叠屏幕,然后再离开它。这是我的自定义页脚组件:

function Footer({navigation}) {
  return(
    <View style={styles.tabBarStyle}>
      <TouchableOpacity style={styles.tabStyle} onPress={() => navigation.navigate('Trading')} />
      <TouchableOpacity style={styles.tabStyle} onPress={() => navigation.navigate('Lending')} />
      <TouchableOpacity style={styles.tabStyle} onPress={() => navigation.navigate('Finance')} />
      <TouchableOpacity style={styles.tabStyle} onPress={() => navigation.navigate('AccountBalances')} />
      <TouchableOpacity style={styles.tabStyle} onPress={() => navigation.navigate('TabScreen')} />
    </View>
  );
}

const NavigationFooter = withNavigation(Footer);

如您所见,当按下TouchableOpacity 元素之一时,我使用navigation.navigate() 转到所需的屏幕,但是,如前所述,这会将我带到屏幕的根部。我知道这基本上是明确告诉应用程序导航到选项卡的根屏幕,但我不知道如何让选项卡“记住”在我离开之前它所在的堆叠屏幕,就像默认标签栏。

【问题讨论】:

  • 可能是您使用自定义底部导航组件的方式:也许您应该直接使用底部导航栏提供的navigation而不是withNavigation HOC? tabBarComponent: props =&gt; &lt;NavigationFooter {...props} /&gt; // ℹ️ pass it here
  • 我对其进行了更改,以便在此处传递 navigation,但是行为仍然与原始问题中描述的相同。不过,这比使用 withNavigation HOC 更好,所以感谢您的建议。

标签: react-native react-navigation react-native-tabnavigator


【解决方案1】:

您可以将实际堆栈的名称传递给navigation.navigate,而不是该特定选项卡上的起始屏幕的名称,并且堆叠的屏幕应该保持不变。所以,而不是,例如

<TouchableOpacity style={styles.tabStyle} onPress={() => navigation.navigate('Trading')}/> //name of the screen

你应该通过它

<TouchableOpacity style={styles.tabStyle} onPress={() => navigation.navigate('TradingStack')}/> //name of the stack

假设TradingTradingStack 中的起始屏幕。

【讨论】:

  • 谢谢,它运行良好。 Zlatan 先生,你一定是个黑客大师之类的。
  • @LiteralMetaphore 你可以叫我机器人先生;)
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2019-01-23
  • 2017-12-31
相关资源
最近更新 更多