2
//root dart file

  FirebaseMessaging.onBackgroundMessage(_backgroundMessageHandler); 
  await NotificationService.instance.initializeNotifications();

  Future<void> _backgroundMessageHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
 }

//In, NotificationService file, I have initialized 
 AwesomeNotification(awesome_notification package),and have 

  //This handles notification actions

  AwesomeNotifications().actionStream.listen((notification) async {
  print(notification.payload);
  if (notification.payload != null) {
    final payload = notification.payload!;
    if (payload['type'] == 'vaccine-records') {
      _appRouter.root.innerRouterOf(DashboardRouter.name)
        ?..innerRouterOf<TabsRouter>(DashboardRoute.name)?.setActiveIndex(2)
        ..navigate(
          VaccineRecordsRouter(
            petId: int.parse(payload['id']!),
            petType: int.parse(payload['pet_type']!),
            petName: notification.title,
          ),
        );
    }
  }
});

 //this listens to new notification from Firebase cloud messaging

FirebaseMessaging.onMessage.listen((message) async {
  print(message.data);
  if (message.data.isNotEmpty) {
    await AwesomeNotifications().createNotificationFromJsonData(message.data);
  } else {
    print('here');
    await AwesomeNotifications().createNotification(
      content: NotificationContent(
        id: 0,
        channelKey: 'basic_channel',
        title: message.notification?.title,
        body: message.notification?.body,
        showWhen: true,
        displayOnForeground: true,
        displayOnBackground: true,
      ),
    );
  }
});
}

When I tap on the notification, it takes me to homepage of my app. I want it to navigate me to some other screen.When the app is in the foreground and I receive the notification, it takes me to the desired page. But when the app is in the background and the notification is received, it takes me to the homepage.How is this happening since the both time i get AwesomeNotifications().actionStream.listen((notification) async {} to execute?

1 Answers1

2

I would suggest you use Firebase dynamic links to send the users to specific page based on the payload of notification.

In your current case,

onMessage function is triggered only when the app is in foreground.

Notifications must be handled for 3 states.

  • When app is in foreground
  • When app is in background
  • When app is terminated

Use the following :

//when app is terminated
  FirebaseMessaging.instance.getInitialMessage().then((value) {
    if (value != null) {
      _onNotificationMessage(context, value); // custom function to handle notification
    }
  });

//when app is in foreground
  FirebaseMessaging.onMessage.listen((message) {
    _onProcessMessage(context, message); // custom function to handle notification
  });

//when app is in background
  FirebaseMessaging.onMessageOpenedApp.listen((message) {
    _onNotificationMessage(context, message); // custom function to handle notification
  });
}
Ganesh Bhat
  • 246
  • 4
  • 19
  • I used this to handle notification in the background. FirebaseMessaging.onBackgroundMessage(_backgroundMessageHandler); Future _backgroundMessageHandler(RemoteMessage message) async { await AwesomeNotifications().createNotification()} I get the notification in the background,but tapping it takes me to the homescreen. This is the main problem. WHY DOES TAPPING THE NOTIFICATION TAKES TO HOMESCREEN? Because I believe Tapping on this notification is handled in the same function i.e. AwesomeNotifications().actionStream.listen((notification) async {} what am I completely wrong about? – Ashish Koirala Apr 22 '22 at 03:53
  • you will get the notification in al scenario , the way it is handled will determine which page it opens. Please read the firebase messaging docs. https://firebase.flutter.dev/docs/messaging/usage/ DId you try the above answer? – Ganesh Bhat Apr 22 '22 at 04:00
  • I have checked it, The problem i have understanding is why should I use in //when app is in foreground FirebaseMessaging.onMessage.listen((message) { _onProcessMessage(context, message); // custom function to handle notification }); //when app is in background FirebaseMessaging.onMessageOpenedApp.listen((message) { _onNotificationMessage(context, message); // custom function to handle notification }); these functions as I am already getting the notifications and AwesomeNotifications().actionStream.listen((notification) async {} already handles all the notification taps – Ashish Koirala Apr 22 '22 at 06:10