
export type RouteList = {
/*
DiaryStack과 MainBottomTab모두 최상위 Stack 네비게이션의 하위에 위치한다.
*/
[ROUTE.DIARY_STACK]: {screen: string; params?: object} | undefined;
[ROUTE.MAIN_BOTTOM_TAB]: {screen: string; params?: object} | undefined;
[ROUTE.CALENDER]: undefined;
[ROUTE.DIARY]: {date: YYYYMMDDHHMM; day: number} | undefined;
[ROUTE.READ_DIARY]: {id: string} | undefined;
[ROUTE.WRITE_DIARY]: {date: YYYYMMDDHHMM} | undefined;
[ROUTE.EDIT_DIARY]: {id: string} | undefined;
};
//최상위 스택 네비에 대한 타입
export type RouteListProps = NativeStackNavigationProp<RouteList>;
//바텀 탭 네비에 대한 타입
export type MainBottomTabRouteProps = BottomTabScreenProps<
RouteList,
typeof ROUTE.MAIN_BOTTOM_TAB
>;
export type DiaryStackRouteProps = NativeStackScreenProps<
RouteList,
typeof ROUTE.DIARY_STACK
>;
...
네비게이션 정보를 모두 가지고 있는 최상위 네비게이션. 이외의 네비게이션을 구현해야할 경우 최상위 네비게이션 하위에 적절히 배치하도록 한다.
//App.tsx 최상위 스택 네비 위치
const Stack = createStackNavigator<RouteList>();
function App(): React.JSX.Element {
...
return (
<SafeAreaView style={{flex: 1}}>
<NavigationContainer>
<Stack.Navigator initialRouteName="DiaryStack">
//상위 네비게이션 연결
<Stack.Screen name="DiaryStack" component={DiaryStack} />
</Stack.Navigator>
</NavigationContainer>
</SafeAreaView>
);
}
export default App;
//DiaryStack.tsx 상위네비게이션
const Stack = createStackNavigator<RouteList>();
export default () => {
return (
<Stack.Navigator
initialRouteName="MainBottomTab"
screenOptions={{headerShown: false, gestureEnabled: true}}>
// 하위 네비게이션 연결
<Stack.Screen name="MainBottomTab" component={MainBottomTab} />
<Stack.Screen name="ReadDiary" component={DiaryReadPage} />
<Stack.Screen name="WriteDiary" component={DiaryWritePage} />
<Stack.Screen name="EditDiary" component={DiaryEditPage} />
</Stack.Navigator>
);
};
//MainBottomTab.tsx 하위 네비게이션
const Tab = createBottomTabNavigator<RouteList>();
export default () => {
return (
<Tab.Navigator>
<Tab.Screen
name="Calender"
component={CalenderPage}
/>
<Tab.Screen
name="Diary"
component={DiaryListPage}
/>
</Tab.Navigator>
);
};
Tab에 위치한 페이지에서 Stack의 페이지로 이동할때 navigation이 경로를 못잡는 경우가 발생. Tab이 화면상 경로를 아예 바꾸는 것이기 때문.
그래서 이동할 때 아래처럼 작성해야했음
navigation.navigate(ROUTE.MAIN_BOTTOM_TAB, {
screen: ROUTE.DIARY,
params: {date: generateYYYYMMDDHHMM(rawDate), day: rawDate.getDay()},
});
Stack은 경로를 화면에 쌓기 때문에 다른 중첩 네비게이션으로 이동할때 별다를 문제없이 경로를 잡을 수 있음
navigation.navigate(ROUTE.DIARY, {
date: generateYYYYMMDDHHMM(rawDate),
day: rawDate.getDay(),
});