React navigation tabBarVisible:false不适用于TabNavigator中的StackNavigator

时间:2018-06-05 13:38:04

标签: javascript react-native react-navigation

我完全感到困惑,以实现类似下面的内容,这工作正常,但无法隐藏EditPage和PageTwo的标签栏

  • 登录
  • 注册
  • TabNavigator的(TabNavigator的)
    • FirstTab
    • SecondTab(StackNavigator)
      • 末页
      • EditPage
    • ThirdTab(StackNavigator)
      • PAGEONE
      • PageTwo
    • 设置

以下是我的配置。

import { createStackNavigator, createSwitchNavigator, createBottomTabNavigator } from 'react-navigation';
//Other required imports here

const SignedOut = createStackNavigator({
  Signup: { screen : Signup},
  Login: { screen : Login}
});

const SignedIn = createBottomTabNavigator({
    Dashboard: {
      screen: Dashboard
    },
    Rewards: {
      screen: createStackNavigator({
        Rewards:{
          screen: Rewards,
          navigationOptions:{
            header:null
          }
        },
        AddReward:{
          screen: AddReward,
          navigationOptions:{
            header:null,
            tabBarVisible: false
          }
        }
      })
    },
    Activities: {
      screen: createStackNavigator({
        Rewards:{
          screen: Activities,
          navigationOptions:{
            header:null
          }
        },
        NewActivity:{
          screen: NewActivity,
          navigationOptions:{
            header:null,
            tabBarVisible: false
          }
        }
      })
    },
    Settings: {
      screen: Settings
    }
},{
  tabBarComponent: ({navigation}) => <FooterComponent navigation={navigation} />,
  tabBarPosition: 'bottom',
  animationEnabled: false,
  swipeEnabled: false
});

export const createRootNavigator = (signedIn) => {
    return createSwitchNavigator(
        {
            SignedIn: {
                screen: SignedIn
            },
            SignedOut: {
                screen: SignedOut
            }
        },
        {
            initialRouteName: (signedIn) ? "SignedIn" :"SignedOut",
            headerMode: 'none'
        }
    );
};

问题

  • 我无法隐藏 AddReward NewActivity
  • 的标签栏
  • tabBarVisible: false不适用于TabNavigator内的StackNavigator

由于

4 个答案:

答案 0 :(得分:1)

您可以将一个StackNavigator与所有堆栈一起使用,并将TabNavigator设置为默认路径:

  • SwitchNavigator
    • 登录
    • 注册
    • StackNavigator
      • TabNavigator的
        • FirstTab
        • 末页
        • PageTwo
        • 设置
      • EditPage
      • PageTwo

答案 1 :(得分:1)

问题在于您的屏幕(奖励和AddRewards位于堆栈导航器中)

OLD:

 Rewards: {
          screen: createStackNavigator({
            Rewards:{
              screen: Rewards,
              navigationOptions:{
                header:null
              }
            },
            AddReward:{
              screen: AddReward,
              navigationOptions:{
                header:null,
                tabBarVisible: false
              }
            }
          })
        }

FIX:

    Rewards: {
          screen: createStackNavigator({
            Rewards,
            AddReward,
          }),
          navigationOptions:{
            header:null,
            tabBarVisible: false
          }
        }

答案 2 :(得分:0)

更多详细信息可以在官方文档中找到,已通过v 3.0.9测试:

A tab navigator contains a stack and you want to hide the tab bar on specific screens

修改后的代码:

const FeedStack = createStackNavigator({
  FeedHome: FeedScreen,
  Details: DetailsScreen,
});

const TabNavigator = createBottomTabNavigator({
  Feed: FeedStack,
  Profile: ProfileScreen,
});

const AppNavigator = createSwitchNavigator({
  Auth: AuthScreen,
  Home: TabNavigator,
});

收件人:

const FeedStack = createStackNavigator({
  FeedHome: FeedScreen,
  /* any other route you want to render under the tab bar */
});

const TabNavigator = createBottomTabNavigator({
  Feed: FeedStack,
  Profile: ProfileScreen,
});

const HomeStack = createStackNavigator({
  Tabs: TabNavigator,
  Details: DetailsScreen,
  /* any other route you want to render above the tab bar */
});

const AppNavigator = createSwitchNavigator({
  Auth: AuthScreen,
  Home: HomeStack,
});

此外,在此示例中,FeedScreen将具有两个标头:一个来自FeedStack,另一个来自HomeStack。为了解决此问题,一种解决方案是将HomeStack的默认标头高度设置为0,并在DetailsS​​creen中覆盖高度。下面是一个示例:

const HomeStack = createStackNavigator(
  {
    Tabs: TabNavigator,
    Details: DetailsScreen,
    /* any other route you want to render above the tab bar */
  },
  {
    initialRouteName: 'Tabs',
    defaultNavigationOptions: {
      headerStyle: { height: 0, },
      headerForceInset: { top: 'never', bottom: 'never' },
    },
  },
);

另一种解决方案是:

A stack contains a tab navigator and you want to set the title on the stack header

const TabNavigator = createBottomTabNavigator({
  Feed: FeedStack,
  Profile: ProfileStack,
});

TabNavigator.navigationOptions = {
  // Hide the header from AppNavigator stack
  header: null,
};

对我而言,这些解决方案有些棘手。 无论如何,它都可以。

答案 3 :(得分:0)

React Navigation v5:

https://www.youtube.com/watch?v=sH6OqX6ANeE

这解决了我的问题。