인프런 커뮤니티 질문&답변

뉴비앱개발자님의 프로필 이미지

작성한 질문수

맛집 지도앱 만들기 (React Native + NestJS)

네이게이터 or 화면 이동 관련해서 문의 드립니다.

해결된 질문

24.06.15 17:24 작성

·

137

0

안녕하세요.

지난번 질문 드렸던 것은 해결이 되었는데요. (인터셉터 / DB 마이그 postgres -> mssql / fcm push )

 

구성은 강의 파일 기반으로 추가 및 수정 하고 있습니다.

nest js 서버( + fcm 송신 서버) -> android(fcm 알림 수신)

android fcm 수신 후 백그라운드 데이터 가공 (서버/로컬 data 처리 ) -> 가공 데이터로 push 생성

데이터 가공 (hooks) 하기 위해 (FetchData.ts) 파일을 import 하였습니다. (ok)

import useFetchData from '@/hooks/useFetchData';

발생한 push 알림 메세지를 클릭시 특정 화면으로 이동하고 싶은데요.

ex) FeedList.tsx // FeedHomeScreen.tsx 쪽으로 이동하고 싶은데요.. 잘 안되고 있습니다.

(이벤트 발생 위치는 알지만 처리를 못하고 있습니다.)

 

App내에서 hooks을 사용해서 그런지

App 내에서 useNavigation() 을 사용해서 처리 하려고 했더니

navigation.navigate('RootNavigator');

MainDrawerNavigator / FeedList / FeedHomeScreen 등등 해봤는데 시작 전에 에러나 가더라고요.

렌더링 에러가 납니다.

import React, { useEffect } from 'react';
import { StatusBar, Platform } from 'react-native';
import { NavigationContainer, useNavigation } from '@react-navigation/native';
import { QueryClientProvider } from '@tanstack/react-query';
import Toast, { BaseToast, BaseToastProps, ErrorToast } from 'react-native-toast-message';

import MainDrawerNavigator from './src/navigations/drawer/MainDrawerNavigator';
import AuthStackNavigator from './src/navigations/stack/AuthStackNavigator';
import useAuth from '@/hooks/queries/useAuth';

import RootNavigator from './src/navigations/root/RootNavigator';
import queryClient from './src/api/queryClient';
import { colors } from '@/constants';
import useThemeStorage from '@/hooks/useThemeStorage';

// push 추가
import messaging from '@react-native-firebase/messaging';
import PushNotification from 'react-native-push-notification';
import PushNotificationIOS from '@react-native-community/push-notification-ios';
import { getEncryptStorage, setEncryptStorage } from '@/utils/encryptStorage';
import useFetchData from '@/hooks/useFetchData';
const App = () => {
  const navigation = useNavigation();    // 화면 이동용
  const { theme } = useThemeStorage();
  const { fetchData } = useFetchData();  // 데이터 가공

  usePushNotifications(fetchData, navigation); // FCM수신 -> 가공data 전달
  useTokenRegistration();  // 토큰 저장

  return (
    <QueryClientProvider client={queryClient}>
      <NavigationContainer>
        <StatusBar
          barStyle={theme === 'light' ? 'dark-content' : 'light-content'}
          backgroundColor={theme === 'light' ? colors['light'].WHITE : colors['light'].BLACK}
        />
        <RootNavigator />              
        <Toast config={toastConfig} />
      </NavigationContainer>
    </QueryClientProvider>
  );
};

어떻게 접근 해야 할지 잘 모르겠습니다.

베이스가 부족해서 그런지 네이게이터와 스크린 (단순 이동 뿐이 못하겠습니다. ㅎㅎ)

주말 잘 보내세요 감사합니다.

 

답변 1

1

Kyo님의 프로필 이미지
Kyo
지식공유자

2024. 06. 15. 18:01

강의와 다른것을 구현하고 계시고, 각 hooks들이 무슨 역할이고 어떻게 구현하셨는지, 어떤에러가 발생했는지 잘 모르겠어서 도움드리기가 어려울것 같아요! 다만 화면을 이동할때 네비게이터를 넣으셨다고 했는데 스크린으로 이동을 해주셔야할것같습니다.

뉴비앱개발자님의 프로필 이미지

2024. 06. 15. 18:07

빠른 답변 감사합니다.

변경된 코드가 강좌와 성격도 다르고 내용도 달라져서 질문하기 쉽지 않았는데요.

좀 더 찾아 보겠습니다. 감사합니다.

Kyo님의 프로필 이미지
Kyo
지식공유자

2024. 06. 15. 18:09

또한 NavigationContainer 안에서 스크린을 이동해야하는데, 그 밖에서 이동을 하면 문제가 될것같아요

뉴비앱개발자님의 프로필 이미지

2024. 06. 15. 18:12

답변 감사합니다.

말씀하시긴 내용 기반으로 이것 저것 해봐야 할 것 같습니다.

사실 특정 화면으로 다이렉트 화면을 이동하고 싶은거라서요.

App->Root->Main->FeedList (기존) 이런식아니고

바로 App(FCM 수신) -> FeeList(변경)로 이동하고 싶은거라서요.

빠른 감사합니다. ㅎㅎ

뉴비앱개발자님의 프로필 이미지

2024. 06. 15. 18:47

감사합니다. 해결했습니다. - 글을 수정했더니 ... 엄청 깨지네요..

 

App에서 직접 사용 안되고 AppContent 한번 감싸서(Boxing?/래핑? ) 사용 해야 되나보네요..

빡싱(boxing) 한번 해서 레벨을 App보다 낮춰서 사용하니깐 되네요.. (이미 fechData.ts 쓸때 사용했는데 이해를 못하고 한거라...... )

AppContent 에서 useNavigation() 선언해서 호출할 곳에서 스크린명으로 호출하니 바로 이동 되네요.

App (TOP)레벨에서는 Hooks이나 useNavigation 을 직접 사용 못해서 그런것 같습니다.

 

navigation.navigate(mainNavigations.선언명);

const AppContent = () => { const navigation = useNavigation(); const { fetchData } = useFetchData(); usePushNotifications(fetchData, navigation); return ( <RootNavigator /> ); }; const App = () => { const { theme } = useThemeStorage(); useTokenRegistration(); return ( <QueryClientProvider client={queryClient}> <NavigationContainer> <StatusBar barStyle={theme === 'light' ? 'dark-content' : 'light-content'} backgroundColor={theme === 'light' ? colors['light'].WHITE : colors['light'].BLACK} /> <AppContent /> <Toast config={toastConfig} /> </NavigationContainer> </QueryClientProvider> ); };