【问题标题】:React navigation: stack navigator with tab navigator is not working反应导航:带有选项卡导航器的堆栈导航器不起作用
【发布时间】:2018-03-10 20:26:17
【问题描述】:

我们还检查了其他问题和文档,但找不到可以解决此问题的任何解决方案。代码如下:

它显示错误消息:

react children 只期望接收一个 react element child。

   const MainTabBar = TabNavigator(
  {

   Home: {screen: HomeScreen},
   Profile: {screen: ProfileScreen},

  },

    {
    navigationOptions: ({ navigation }) => ({
      tabBarIcon: ({ focused, tintColor }) => {
        const { routeName } = navigation.state;
        let iconName;
        if (routeName === 'Home') {
          iconName = 'search';
        } 
         else if (routeName === 'Profile') {
          iconName = 'contact';
        }

        return <Ionicons name={iconName} size={25} color={tintColor} />;
      },
    }),
    tabBarOptions: {
      activeTintColor: '#222222',
      inactiveTintColor: '#222222',
    },
    tabBarComponent: TabBarBottom,
    tabBarPosition: 'bottom',
    animationEnabled: false,
    swipeEnabled: false,
    initialRouteName: 'Saved'

  }
);

const Main = StackNavigator(
  {
   Signin: {screen: SigninScreen},
    Signup: {screen: SignupScreen},
    Welcome: {screen: WelcomeScreen},
   Settings: {screen: SettingsScreen},
   Post: {screen: PostScreen},
   MainTab: {screen: MainTabBar}
  },
  {
    initialRouteName: "Signin",
    headerMode: "none",
  },
);

这 2 个导航器 Stack navigator 和 Tab navigator 如何相互协作?目前我们正在尝试从登录导航到主页,而 this.props.navigation.navigate () 选项不起作用。过去我们使用 Drawer 而不是 Tab 时它可以工作,但现在它不适用于 Tabs。

【问题讨论】:

    标签: react-native react-native-android react-navigation react-native-ios native-base


    【解决方案1】:

    遇到同样的问题,我发现两个导航器在同一范围内(在反应组件内)会导致这个问题。

    例如:这行不通:

    const Tab = createBottomTabNavigator();
    const Stack = createStackNavigator();
    
    const A = ({ navigation }) => {
      const B = (
        <Tab.Navigator>
          ...
        </Tab.Navigator>
      );
      const C = () => (
        <Stack.Navigator headerMode="none">
          <Stack.Screen name="Default" component={B} />
            ...
          </Stack.Navigator>
      );
      return C;
    };
    
    export A;
    

    但这会起作用:

    const Tab = createBottomTabNavigator();
    const Stack = createStackNavigator();
    
    const A = ({ navigation }) => {
      const B = (
        <Tab.Navigator>
          ...
        </Tab.Navigator>
      );
      return B;
    };   
    
    const C = () => (
      <Stack.Navigator headerMode="none">
        <Stack.Screen name="Default" component={A} />
          ...
        </Stack.Navigator>
    );
    
    export C;
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      const MainTabBar = TabNavigator(
        {
         Home: {screen: HomeScreen},
          Chat: {screen: ChatScreen},
          Profile: {screen: ProfileScreen},
        },
        ...
          // Set initial tab to HomeScreen/Tab
          initialRouteName: 'Home'
          swipeEnabled: false,
        }
      );
      
      const Main = StackNavigator(
        {
          Post: {screen: PostScreen},
          Signin: {screen: SigninScreen},
          Signup: {screen: SignupScreen},
          Welcome: {screen: WelcomeScreen},
          Settings: {screen: SettingsScreen},
          //Add MainTab as a screen
          MainTab: {screen: MainTabBar}
        },
        ...
      );
      

      然后从您的 SigninScreen :this.props.navigation.navigate() 导航到“MainTab”作为路由名称。

      这里有一篇好文章可以阅读React-Navigation : Stack Navigator inside Tab Navigator inside Drawer Navigator

      【讨论】:

      • 感谢您的回复 :) 但是它不起作用。我已经在您的解决方案中添加了更新的代码,它显示了我在问题中提到的错误。怎么了?我真的很困惑。
      • 我不知道为什么会导致这样的问题。
      • 我还添加了这 2 个问题的图像,这是在进行您建议的更改后引起的。
      猜你喜欢
      • 2020-01-28
      • 2020-07-10
      • 2020-12-02
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2022-08-12
      • 2021-02-10
      相关资源
      最近更新 更多