'flutter - don't show notification when user is on certain page

My app has chatting function. And I have implemented Firebase Cloud Messaging and Local Notification.

So when someone sends me a message, notification(one inside android status bar) and local notification(one on the upper part of the screen that holds for like 3 seconds) is shown. They show up when app is opened, on background, and also when app is terminated. (So far so good)

But I don't want both notifications(1. fcm notification, 2. local notification) to show up when I'm already in the chat page with that person. And I have no idea where to start.

Below is my code for handling fcm and show local notification. They are inside main.dart and the main function calls initializeFCM before returning my root page.

Future<void> initializeFCM() async {
  await Firebase.initializeApp();

  FirebaseMessaging messaging = FirebaseMessaging.instance;

  // Firebase Messaging
  NotificationSettings settings = await messaging.requestPermission(
    alert: true,
    announcement: false,
    badge: true,
    carPlay: false,
    criticalAlert: false,
    provisional: false,
    sound: true,
  );

  if (settings.authorizationStatus == AuthorizationStatus.authorized) {
    // print('User granted permission');
  } else
  if (settings.authorizationStatus == AuthorizationStatus.provisional) {
    // print('User granted provisional permission');
  } else {
    // print('User declined or has not accepted permission');
  }



  // Get any messages which caused the application to open from
  // a terminated state.
  RemoteMessage? initialMessage = await messaging.getInitialMessage();

  if (initialMessage != null) {
    handleMessage(initialMessage);
  }


  // initialize local notification
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  // terminated app을 local notification 눌러서 열었을 때 - payload가 정상적으로 동작하지 않음
  final NotificationAppLaunchDetails? notificationAppLaunchDetails = await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();
  final didNotificationLaunchApp = notificationAppLaunchDetails?.didNotificationLaunchApp ?? false;
  if (didNotificationLaunchApp) {
    onSelectNotification(notificationAppLaunchDetails!.payload);
  }


  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    showLocalNotification(message);
  });

  FirebaseMessaging.onBackgroundMessage(showLocalNotification);

  FirebaseMessaging.onMessageOpenedApp.listen(handleMessage);
}


void handleMessage(RemoteMessage message) {
  if (message.data["screen"] == "message") {
    Navigator.push(
        navigatorKey.currentContext!,
        MaterialPageRoute(
          builder: (context) => MessageListPage(),
        )
    );
  }
}

Future<void> onSelectNotification(payload) async {
  if(payload != null) {
    Map<String, dynamic> data = json.decode(payload);

    if (data['screen'] == "message") {
      Navigator.push(
          navigatorKey.currentContext!,
          MaterialPageRoute(
            builder: (context) => MessageListPage(),
          )
      );
    }
  }
}


Future<void> showLocalNotification(RemoteMessage message) async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  RemoteNotification? notification = message.notification;
  AndroidNotification? android = message.notification?.android;
  // String screen = message.data['screen'];

  // iOS heads up notification setting
  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true, // Required to display a heads up notification
    badge: true,
    sound: true,
  );

  // android channel setting
  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'high_importance_channel', // id
    'High Importance Notifications', // title
    importance: Importance.max,
  );

  // initialize local notification
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  await flutterLocalNotificationsPlugin.initialize(InitializationSettings(
      android: AndroidInitializationSettings('@drawable/mentea_ic_stat_name'),
      iOS: IOSInitializationSettings()),
      onSelectNotification: onSelectNotification);

  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
      AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  // If `onMessage` is triggered with a notification, construct our own
  // local notification to show to users using the created channel.
  if (notification != null && android != null) {
    // print('Message also contained a notification: ${message.notification}');
    flutterLocalNotificationsPlugin.show(
      notification.hashCode,
      notification.title,
      notification.body,
      NotificationDetails(
        android: AndroidNotificationDetails(
          'high_importance_channel', //channel.id,
          'High Importance Notifications', //channel.name,
          icon: android.smallIcon,
          color: primaryColor,
          // other properties...
        ),
      ),
      payload: json.encode(message.data)
    );
  }
}



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source