【问题标题】:React navigation bottom tabs not working with multiple stack navigators反应导航底部选项卡不适用于多个堆栈导航器
【发布时间】:2020-06-16 06:41:36
【问题描述】:

我在实现底部导航栏时遇到问题,这是我的代码

import React from 'react';
import { createAppContainer, createSwitchNavigator } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import { fromLeft, fromBottom, fadeOut, fromRight } from 'react-navigation-transitions';
import { createBottomTabNavigator } from 'react-navigation-tabs';
import constants from '../utilities/index';
import { Image, Dimensions } from 'react-native';
import { RFValue } from 'react-native-responsive-fontsize';

/***************************** Routes ***************************************/
import MainScreen from '../screens/MainScreen/MainScreen';
import AuthScreen from '../screens/Auth/AuthScreen'
import Login from '../screens/Auth/Login'
import Register from '../screens/Auth/Register'
import ForgorPasswordScreen from '../screens/Auth/ForgotPasswordScreen'
import PasswordSentScreen from '../screens/Auth/PasswordSentScreen'
import PapperScreen from '../screens/Papper/PapperScreen'
import SpecialitySearch from '../screens/Speciality/SpecialitySearch'
import SpecialityNotFound from '../screens/Speciality/SpecialityNotFound'
const { width, height } = Dimensions.get('window');

const tabBasedNavigation = createBottomTabNavigator({
  Home: {
    screen: PapperScreen, navigationOptions: {
      tabBarLabel: 'Home',
      tabBarIcon: ({ focused }) => {
        return (
          <Image source={focused ? constants.images.HomeActive : constants.images.HomeActiveInactive} />
        )
      }
    }
  },
  Booking: {
    screen: SpecialitySearch, navigationOptions: {
      tabBarLabel: 'Booking',
      tabBarIcon: ({ focused }) => {
        return (
          <Image source={focused ? constants.images.BookingActive : constants.images.BookingInactive} />
        )
      }
    }
  },
  Chat: {
    screen: PapperScreen, navigationOptions: {
      tabBarLabel: 'Chat',
      tabBarIcon: ({ focused }) => {
        return (
          <Image source={focused ? constants.images.ChatActive : constants.images.ChatInActive} />
        )
      }
    }
  },
  Account: {
    screen: SpecialitySearch, navigationOptions: {
      tabBarLabel: 'Account',
      tabBarIcon: ({ focused }) => {
        return (
          <Image source={focused ? constants.images.AccountActive : constants.images.AccountInActive} />
        )
      }
    }
  },
}, {
    tabBarOptions: {
      activeTintColor: constants.colors.dullYellow,
      labelStyle: {
        fontFamily: constants.fontFamily.HKGroteskRegular,
        fontSize: RFValue(12),
        marginBottom: height * 1 / 100
      },
      style: {
        height: height * 9 / 100,
      },
    }
  });

const BeforeLoginStack = createStackNavigator({
  MainScreen,
  AuthScreen,
  Login,
  Register,
  ForgorPasswordScreen,
  PasswordSentScreen,

}, {
    transitionConfig: (nav) => handleCustomTransition(nav),
    defaultNavigationOptions: {
      header: null,
    }
  });


const AfterLoginStack = createStackNavigator({
  homeTabs: tabBasedNavigation,
  PapperScreen,
  SpecialitySearch,
  SpecialityNotFound,

}, {
    transitionConfig: (nav) => handleCustomTransition(nav),
    defaultNavigationOptions: {
      header: null,
    }
  }); 


const MainNavigator = createSwitchNavigator({
  BeforeLoginStack,
  AfterLoginStack
});

const handleCustomTransition = ({ scenes }) => {
  const prevScene = scenes[scenes.length - 2];
  const nextScene = scenes[scenes.length - 1];

  // Custom transitions go there
  if (prevScene
    && prevScene.route.routeName === 'MainScreen'
    && nextScene.route.routeName === 'AuthScreen') {
    return fromBottom(500);
  } else if (prevScene
    && ( (prevScene.route.routeName === 'AuthScreen'
    && nextScene.route.routeName === 'ForgorPasswordScreen') || 
    (prevScene.route.routeName === 'ForgorPasswordScreen'
    && nextScene.route.routeName === 'PasswordSentScreen'))) {
    return fromRight(); 
  }
  return fadeOut();
}
export default createAppContainer(MainNavigator);

当我使用多个 stackNavigators 时会出现问题。如果我使用单个堆栈导航器,则底部导航有效。但是当我放置多个堆栈导航器时,底部导航不会显示。

 const MainNavigator = createSwitchNavigator({
      AfterLoginStack
    });

如果我只使用 AfterLoginStack,底部导航栏是可见的。但是当我如下放置两个堆栈导航器时,底部导航不显示。

const MainNavigator = createSwitchNavigator({
      BeforeLoginStack,
      AfterLoginStack
    });

请提出解决方案。

【问题讨论】:

    标签: react-native react-navigation-bottom-tab


    【解决方案1】:

    您的tabBasedNavigation 被放入AfterLoginStack

    如果你像这样创建SwitchNavigator

    const MainNavigator = createSwitchNavigator({
      BeforeLoginStack,
      AfterLoginStack
    });
    

    SwitchNavigator 的初始路由将是 BeforeLoginStack,因此当 BeforeLoginStack 出现在屏幕上时,AfterLoginStack 内的底部选项卡将不可见。

    你应该改成这样:

    const MainNavigator = createSwitchNavigator({
        BeforeLoginStack,
        AfterLoginStack
    }, {
        initialRouteName: 'AfterLoginStack'
    });
    

    【讨论】:

    • 感谢您的解决方案。但是它将我直接带到主屏幕的作用是,我希望在我到达主屏幕之前显示 BeforeLoginStack
    • 还有其他解决方案吗?
    • 我虽然你当前的代码已经解决了?所以你想在 BeforeLoginStack 中显示底部标签?
    • 不,我不想在 BeforeLoginStack 中显示它。我希望它只显示在 AfterLoginStack 之后。
    • 所以你的问题是当你进入 AfterLoginStack 时底栏不显示,对吧?
    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2020-01-28
    • 2020-07-10
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多