嵌套在堆栈导航器中的 React Native 选项卡导航器

时间:2021-02-17 07:42:22

标签: javascript reactjs react-native react-navigation

我对 React Native 比较陌生,正在为屏幕而苦苦挣扎。我已经浏览了嵌套导航文档 (https://reactnavigation.org/docs/nesting-navigators/),它帮助我设置了初始导航设置,但我遇到了一些问题。

我正在尝试设置应用程序,使其初始屏幕为“选择用户”,没有选项卡导航。选择用户后,您将被重定向到另一个具有选项卡导航的屏幕。我目前可以正常工作,但是在初始屏幕之后我无法访问任何路由/道具/参数。

我不得不使用 import { useNavigation } from "@react-navigation/native"; 手动导入导航,尽管我在 Navigation.push 中提供了参数,但尝试在我的屏幕中访问 {route} 时会指出路线未定义。

我的屏幕设置如下所示:

const Tab = createBottomTabNavigator();
const WelcomeStack = createStackNavigator();
const HomeStack = createStackNavigator();
const SettingsStack = createStackNavigator();
const Stack = createStackNavigator();

const WelcomeStackScreen = () => (
    <WelcomeStack.Navigator>
        <WelcomeStack.Screen
            name="Welcome"
            component={WelcomeScreen}
            options={{ headerShown: false }}
        />
        <WelcomeStack.Screen
            name="SignUp"
            component={SignUpScreen}
            options={{ headerShown: false }}
        />
    </WelcomeStack.Navigator>
);

const HomeStackScreen = () => {
    return (
        <HomeStack.Navigator>
            <HomeStack.Screen name="Home" component={HomeScreen} />
            <HomeStack.Screen
                name="Search"
                component={SearchResultScreen}
                options={({ navigation }) => ({
                    headerLeft: () => (
                        <Ionicons
                            name={"arrow-back"}
                            size={30}
                            color={colours.text}
                            style={{ paddingLeft: 15 }}
                            onPress={() => {
                                navigation.goBack();
                            }}
                        />
                    ),
                })}
            />
            <HomeStack.Screen
                name="Select"
                component={SelectScreen}
                options={({ navigation, route }) => ({
                    title: route.params.name,
                    headerLeft: () => (
                        <Ionicons
                            name={"arrow-back"}
                            size={30}
                            color={colours.text}
                            style={{ paddingLeft: 15 }}
                            onPress={() => {
                                navigation.goBack();
                            }}
                        />
                    ),
                })}
            />
            <HomeStack.Screen name="Read" component={ReaderScreen} />
        </HomeStack.Navigator>
    );
};

function SettingsScreen() {
    return (
        <View
            style={{ flex: 1, justifyContent: "center", alignItems: "center" }}
        >
            <Text>TBD</Text>
        </View>
    );
}

const SettingsStackScreen = () => (
    <SettingsStack.Navigator>
        <SettingsStack.Screen name="Settings" component={SettingsScreen} />
    </SettingsStack.Navigator>
);

const TabNavigator = ({ route }) => (
    <Tab.Navigator
        screenOptions={({ route }) => ({
            tabBarIcon: ({ focused, color, size }) => {
                let iconName;
                switch (route.name) {
                    case "Home":
                        iconName = focused ? "home" : "home-outline";
                        break;
                    case "Settings":
                        iconName = focused ? "list" : "list-outline";
                        break;
                    default:
                        break;
                }

                return <Ionicons name={iconName} size={size} color={color} />;
            },
        })}
        tabBarOptions={{
            activeTintColor: "tomato",
            inactiveTintColor: "gray",
        }}
    >
        <Tab.Screen name="Home" component={HomeStackScreen} />
        <Tab.Screen name="Settings" component={SettingsScreen}/>
    </Tab.Navigator>
);

export default function App() {
    return (
        <NavigationContainer theme={navThemeOverride}>
            <Stack.Navigator>
                <Stack.Screen name="Welcome" component={WelcomeStackScreen} />
                <Stack.Screen
                    name="TabNavigator"
                    component={TabNavigator}
                    options={{ headerShown: false }}
                    navigationOptions={{ gesturesEnabled: false }}
                />
            </Stack.Navigator>
        </NavigationContainer>
    );
}

以下是欢迎屏幕导航的片段

navigation.push("TabNavigator", {
    screen: "Home",
    params: {
      userId: userId,
  },
});

1 个答案:

答案 0 :(得分:2)

你试图从你的父标签导航器导航到的主屏幕......也是一个 StackNavigator......我想你想导航到 Select 屏幕......所以还有一个额外的您的导航工作所需的级别...

   navigation.navigate('TabNavigator', {
      screen: 'Home', // <--- StackNavigator
      params: {
        screen: 'Select', // <-- nested inside HomeStack
        params: {
          title: 'Your custom title for Select screen here ...',
        },
      },
    });

加号 +

route 导航器中有 Tab 的双重定义

const TabNavigator = ({ route }) => ( //<--- here
    <Tab.Navigator
        screenOptions={({ route }) => ({ // <- and here

改为

function TabNavigator() {
  return <Tab.Navigator screenOptions={({ route }) => ({})>{/* ...Tabs... */}</Tab.Navigator>;
}