main.dart

import "package:flutter/material.dart";
import "package:firebase_core/firebase_core.dart";
import "firebase_options.dart";
import "noti.dart";
import "package:firebase_messaging/firebase_messaging.dart";

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // If you're going to use other Firebase services in the background, such as Firestore,
  // make sure you call `initializeApp` before using other Firebase services.
  await Firebase.initializeApp();

  print("----------------------------");
  print("Handling a background message: ${message.toMap()}");
  print("----------------------------");
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  // Background
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  static FirebaseAnalytics analytics = FirebaseAnalytics.instance;
  static FirebaseAnalyticsObserver observer = FirebaseAnalyticsObserver(analytics: analytics);

  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "My App",
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: <NavigatorObserver>[observer],
      //home: FirebaseApp(title: "Firebase App", analytics: analytics, observer: observer),
      //home: const MemoPage(title: "RealDatabase"),
      home: const Noti(title: "Firebase Cloud Messaging"),
    );
  }
}

 

noti.dart

import "package:flutter/material.dart";
import "package:firebase_messaging/firebase_messaging.dart";

class Noti extends StatefulWidget {
  final String title;

  const Noti({super.key, required this.title});

  @override
  State<StatefulWidget> createState() => _Noti();
}

class _Noti extends State<Noti> {
  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    _initFirebaseMessaging(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: const Center(
        child: Text("알림수신 테스트"),
      ),
    );
  }

  Future<void> _initFirebaseMessaging(BuildContext context) async {
    FirebaseMessaging fcm = FirebaseMessaging.instance;
    print("messaging.getToken() :  ${await fcm.getToken()}");

    // When?
    RemoteMessage? initialMessage = await fcm.getInitialMessage();

    if (initialMessage != null) {
      print("----------------------------");
      print("param : ${initialMessage.toMap()}");
      print("----------------------------");
      _handleMessage("Terminated", initialMessage.notification);
    }

    // Foreground
    FirebaseMessaging.onMessage.listen((event) {
      //print("param : ${event.toMap()}");
      _handleMessage("Foreground", event.notification);
    });

    // opened app from tray
    FirebaseMessaging.onMessageOpenedApp.listen((event) {
      //print("param : ${event.toMap()}");
      _handleMessage("Background", event.notification);
    });
  }

  void _handleMessage(type, message) {
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("$type 알림 - ${message.title}"),
            content: Text(message.body!),
            actions: [
              TextButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: const Text("확인")
              )
            ],
          );
        }
    );
  }
}