Firebase

Implementing Push Notifications in Flutter with FCM

Muhammad Shakil Muhammad Shakil
Mar 15, 2026
5 min read
Implementing Push Notifications in Flutter with FCM
Back to Blog

Push notifications are the lifeblood of modern mobile apps – they drive engagement, retention, and conversions. But here's the kicker: implementing them correctly in Flutter can be a nightmare. I've seen apps lose 30% of their users because of broken notification flows. That's why getting Flutter push notifications right with Firebase Cloud Messaging (FCM) is crucial in 2024. Whether you're building an e-commerce app, a social platform, or a fintech solution, this guide will walk you through the entire process – from setup to production-grade implementation.

Key Takeaways: Flutter Push Notifications with FCM

  1. FCM is the most reliable way to implement push notifications in Flutter apps
  2. Proper notification handling requires both foreground and background states
  3. Always implement deep linking with your notifications
  4. Testing on both iOS and Android is crucial – they handle notifications differently
  5. Use Firebase Cloud Functions for advanced notification logic
  6. Track notification metrics using Firebase Analytics
  7. Handle permission flows gracefully on iOS 16+

What Are Flutter Push Notifications and Why Use FCM?

Push notifications are messages that apps send to users' devices, even when the app isn't open. In Flutter, Firebase Cloud Messaging (FCM) is the go-to solution because:

How FCM Works in Flutter

Here's the basic flow:

  1. Your server sends a message to FCM
  2. FCM delivers it to the target device
  3. The Flutter app receives the message
  4. Your app handles the message based on its state

📌 Pro Tip

Always use the latest version of firebase_messaging package. As of May 2024, it's version 14.0.0+ – breaking changes are common, so check pub.dev for updates.

Setting Up Firebase Messaging in Flutter

Let's get hands-on with the setup process. I'll walk you through every step – including the parts that usually trip people up.

Android Configuration

First, add these dependencies in your android/app/build.gradle:


        dependencies {
          implementation 'com.google.firebase:firebase-messaging:23.0.0'
        }
        

iOS Configuration

For iOS, you'll need to enable push notifications in Xcode and add this to your Info.plist:


        <key>FirebaseAppDelegateProxyEnabled</key>
        <false/>
        

⚠️ Watch Out

Don't skip the APNs certificate setup in Firebase Console – it's required for iOS notifications to work. I've lost hours debugging this.

Implementing Basic Push Notifications

Now for the fun part – let's write some Dart code. Here's how to set up basic notification handling:

Initialize Firebase Messaging

Start by initializing the messaging instance:


        import 'package:firebase_messaging/firebase_messaging.dart';

        final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;

        void initializeNotifications() async {
          await _firebaseMessaging.requestPermission();

          // Get token for this device
          String? token = await _firebaseMessaging.getToken();
          print("FCM Token: $token");
        }
        

Handling Notification Messages

Here's how to handle incoming messages:


        FirebaseMessaging.onMessage.listen((RemoteMessage message) {
          print('Got a message whilst in the foreground!');
          print('Message data: ${message.data}');

          if (message.notification != null) {
            print('Message also contained a notification: ${message.notification}');
          }
        });
        

Advanced Notification Features

Let's level up your notification game with some advanced techniques.

Deep Linking with Notifications

Deep linking is crucial for user engagement. Here's how to implement it:


        FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
          final String route = message.data['route'] ?? '/';
          Navigator.pushNamed(context, route);
        });
        

Local Notifications

For better UX, combine FCM with local notifications:


        import 'package:flutter_local_notifications/flutter_local_notifications.dart';

        final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
            FlutterLocalNotificationsPlugin();

        void showLocalNotification(RemoteMessage message) {
          const AndroidNotificationDetails androidPlatformChannelSpecifics =
              AndroidNotificationDetails(
            'your_channel_id', 'your_channel_name',
            importance: Importance.max,
            priority: Priority.high,
          );

          const NotificationDetails platformChannelSpecifics =
              NotificationDetails(android: androidPlatformChannelSpecifics);

          flutterLocalNotificationsPlugin.show(
            0,
            message.notification?.title,
            message.notification?.body,
            platformChannelSpecifics,
          );
        }
        

🚀 Performance Tip

Use Firebase Cloud Functions to handle complex notification logic – it reduces client-side processing and improves battery life.

FCM vs Other Push Notification Solutions

While FCM is the standard, let's compare it with alternatives:

Common Mistakes to Avoid

After implementing FCM in dozens of apps, here are the top pitfalls I've seen:

  1. Not handling notification permissions properly on iOS
  2. Forgetting to test both foreground and background states
  3. Not implementing proper error handling for FCM tokens
  4. Ignoring notification channels on Android
  5. Not tracking notification delivery and engagement

Performance Optimization

Here's how to ensure your notifications don't drain battery or slow down your app:

Real-World Implementation: E-Commerce App Example

Let's walk through a complete implementation for an e-commerce app:

Setting Up Notification Types

Define your notification types in a centralized enum:


        enum NotificationType {
          orderUpdate,
          promotion,
          abandonedCart,
          priceDrop,
        }
        

Handling Different Notification Scenarios

Create a handler for each notification type:


        void handleNotification(RemoteMessage message) {
          final type = NotificationType.values.byName(message.data['type']);

          switch (type) {
            case NotificationType.orderUpdate:
              handleOrderUpdate(message);
              break;
            case NotificationType.promotion:
              handlePromotion(message);
              break;
            case NotificationType.abandonedCart:
              handleAbandonedCart(message);
              break;
            case NotificationType.priceDrop:
              handlePriceDrop(message);
              break;
          }
        }
        

Final Thoughts

Implementing push notifications in Flutter with FCM doesn't have to be painful. With the right setup and architecture, you can create notification flows that truly engage your users. Remember to:

📚 What's Next

Ready to take your Flutter skills to the next level? Check out our guide on Flutter Clean Architecture or dive into Firebase Cloud Functions integration for advanced backend patterns.

Frequently Asked Questions

How to implement FCM push notifications in Flutter?

To implement FCM push notifications in Flutter, add the `firebase_messaging` plugin (latest version: ^14.7.0) to your `pubspec.yaml`. Configure Firebase Console for Android (adding `google-services.json`) and iOS (adding `GoogleService-Info.plist`). Use `FirebaseMessaging.onMessage` for foreground handling and `FirebaseMessaging.onBackgroundMessage` for background/terminated states.

What is FCM in Flutter push notifications?

FCM (Firebase Cloud Messaging) is Google's cross-platform messaging service for sending push notifications to Android, iOS, and web apps. In Flutter, it integrates via the `firebase_messaging` plugin, supporting foreground/background/terminated states. FCM handles message delivery, token registration, and platform-specific configurations.

FCM vs OneSignal for Flutter push notifications: which is better?

FCM is free, directly integrated with Firebase, and ideal for developers already using Firebase services. OneSignal offers additional features like A/B testing and analytics but requires a third-party setup. Choose FCM for cost efficiency and tight Firebase integration, or OneSignal for advanced marketing tools.

How to handle background notifications with FCM in Flutter?

For background notifications, define a top-level `Future` function annotated with `@pragma('vm:entry-point')` and pass it to `FirebaseMessaging.onBackgroundMessage`. Ensure it runs independently by avoiding UI-related code. Test using Postman or Firebase Console to send notifications while the app is minimized.

Can Flutter FCM notifications work on iOS?

Yes, but iOS requires additional setup: enable Push Notifications in Xcode under Signing & Capabilities, upload APNs authentication key to Firebase Console, and configure `AppDelegate.swift` for silent notifications. Note that iOS simulators don't support push notifications—test on physical devices.

Why are my Flutter FCM notifications not showing up?

Common issues include missing `google-services.json` (Android), incorrect APNs setup (iOS), or unhandled notification payloads. Ensure the `firebase_messaging` plugin is updated (^14.7.0+) and check device token registration using `FirebaseMessaging.instance.getToken()`. Debug with `onMessage` and `onBackgroundMessage` listeners.

Share this article:

Have an App Idea?

Let our team turn your vision into reality with Flutter.