RN

상단 + 하단 네비게이션 정리

hihijh826 2023. 8. 2. 23:10
728x90
반응형
SMALL

1.

프로젝트 준비하기

 

스택 네비게이터, 하단 네비게이터, 아이콘

yarn add @react-navigation/native @react-navigation/native-stack @react-navigation/bottom-tabs react-native-screens react-native-safe-area-context react-native-vector-icons

 

아이콘 사용  

1) ios/프로젝트이름/Info.plist 의 맨 밑에...

<key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
    <key>UIAppFonts</key>
    <array>
    <string>MaterialIcons.ttf</string>
    </array>

</dict>
</plist>

2) android/app/build.gradle - 의 맨 밑에...

project.ext.vectoricons = [
    iconFontNames:['MaterialIcons.ttf']
]
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)

 

 

 

 

2. 구조 파악

 

RootStack이라는 네이티브 스택 네비게이션 이용.

mainTab : 하단 탭 네비게이션

- 이 안에 세가지 screen을 만들 것임

- writescreen(의미의 이름) 안에는 하단 탭이 나타나지 않도록 해줌 

 

(1)App.js

import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
import RootStack from './screens/RootStack';

function App(){
  return <NavigationContainer>

 <RootStack/>

  </NavigationContainer>;
}
export default App;

(2) RootStack.js 

//스택 네비게이션
import react from 'react';
import {createNativeStackNavigator} from '@react-navigation/native-stack';
import MainTab from './MainTab';
import WriteScreen from'./WriteScreen';

const Stack = createNativeStackNavigator();

function RootStack(){
    return (
        <Stack.Navigator>
            <Stack.Screen
            name = "MainTab"
            component = {MainTab}
            options={{headerShown: false}}
            //false로 안하면 헤더 두개가 중첩되어 나타남
/>
        <Stack.Screen name="Write" component={WriteScreen}/>

        </Stack.Navigator>
    );
}
export default RootStack;

(3) writescreen.js (임의의 이름. 하단 탭 네비게이션이 없는 스크린) 

//하단 탭 네비게이션이 없는 스크린
import React from 'react';
import {StyleSheet,View} from 'react-native';

function WriteScreen(){
    return <View style = {StyleSheet.block}/>;
}

const styles = StyleSheet.create({
    block:{},
});

export default WriteScreen;

(4)FeedsScreen.js ( 하단 탭 내부의 스크린들. 의미의 이름임)

import React from 'react';
import {StyleSheet,View} from 'react-native';

function FeedsScreen(){
    return <View style = {StyleSheet.block}/>;
}

const sytles = StyleSheet.create({
    block:{},
});

export default FeedsScreen;

(5) MainTab.js ( 하단 탭 네비게이션)

//하단 탭
import React from 'react';
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
//하단 탭 안에 넣을 스크린들 삽입
import FeedsScreen from './FeedsScreen';
import Icon from 'react-native-vector-icons/MaterialIcons';

const Tab = createBottomTabNavigator();

function MainTab(){
    return(
        <Tab.Navigator
            tabBarOptions = {{
                showLabel:false,
                activeTintColor:"black",
            }}>
            <Tab.Screen name="Feeds"
            component={FeedsScreen}
            options={{
                tabBarIcon: ({color,size}) =>(
                    <Icon name="view-stream" size={size} color={color}/>
                ),
            }}
            />
        </Tab.Navigator>
    );
}

export default MainTab;


<Tab.Navigator
            tabBarOptions = {{
                showLabel:false,
                activeTintColor:"black",
            }}>
            <Tab.Screen name="Feeds"
            component={FeedsScreen}
            options={{
                tabBarIcon: ({color,size}) =>(
                    <Icon name="view-stream" size={size} color={color}/>
                ),
            }}
            />
        </Tab.Navigator>
-------> 이 부분을 복붙하여 각 스크린에 맞게 변형하면 됨 
728x90
반응형
LIST