[Flutter] FCM push intent (context 없이 페이지 라우팅)

💛DabongLog·2022년 7월 18일
0

📌 기능 구현

목록 보기
2/4
post-thumbnail

firebase_messaging 플러그인 바탕으로 push를 클릭했을 시 특정 화면으로 라우팅시키는 방법이다.

(본 포스팅은 fcm 세팅을 마치고 push를 잘 받는 상태를 가정한다.)

GlobalVariable 생성

push를 클릭하여 네비게이팅 시에는 context없이 라우팅이 가능해야 한다. 따라서 GlobalVariable.dart 파일을 만들어준 후 다음과 같이 key를 생성해준다.

class GlobalVariable {
  static final GlobalKey<NavigatorState> navState = GlobalKey<NavigatorState>();
}

MaterialApp에 key 세팅

main.dart 파일의 MaterialApp에 위 GlobalVariable key를 세팅한다.

child: MaterialApp(
        navigatorKey: GlobalVariable.navState,  
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          splashColor: Colors.transparent,
          highlightColor: Colors.transparent,
          hoverColor: Colors.transparent,
        ),
        home: MyApp(),
       )

앱이 포그라운드에 있을 때

앱이 켜져있는 상태에서 push가 오면 GlobalVariable를 이용하여 특정 화면으로 라우팅 시키는 코드이다. 해당 코드에서는 push로 받는 title과 body로 구분한다.

FirebaseMessaging.onMessage.listen((event) {
  
      if(event.notification!.title!.contains('test')){
         Navigator.of(GlobalVariable.navState.currentContext!)
             .push(MaterialPageRoute(
             builder: (context) => ServiceIntroPage()));
      
         return;
       }

    });

앱이 백그라운드에 있을 때

앱이 백에 있고, push를 클릭했을 시 앱이 켜지면서 특정 화면으로 라우팅 시키는 코드이다. 해당 코드에서는 서버에서 받는 메시지로 화면을 구분한다.

서버와 규정한 구분자는 'screen', 받은 메시지는 'MainPage'임을 가정한다.

    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      LogPrint('msg : ${message.data}');  //서버에서 주는 메시지가 담김

      if(message.data['screen'] == 'MainPage') {
   			SchedulerBinding.instance!.addPostFrameCallback((_) {
        	   Navigator.of(GlobalVariable.navState.currentContext!)
               .push(MaterialPageRoute(
               builder: (context) => MainPage()));
         });
         return;
      }
    });
profile
모바일 어플리케이션 개발자 (Flutter, iOS, Android)

0개의 댓글