firebase_messaging 플러그인 바탕으로 push를 클릭했을 시 특정 화면으로 라우팅시키는 방법이다.
(본 포스팅은 fcm 세팅을 마치고 push를 잘 받는 상태를 가정한다.)
push를 클릭하여 네비게이팅 시에는 context없이 라우팅이 가능해야 한다. 따라서 GlobalVariable.dart 파일을 만들어준 후 다음과 같이 key를 생성해준다.
class GlobalVariable {
static final GlobalKey<NavigatorState> navState = GlobalKey<NavigatorState>();
}
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;
}
});