본문 바로가기
Flutter

[Flutter] 플러터 - fcm foreground notification click 포어그라운드 알림 클릭 이벤트 구현 (onDidReceiveNotificationResponse)

by s_hoonee 2024. 1. 19.
반응형

runApp 수준 전에 플러터 로컬 노티를 초기화 해서 onDidReceiveNotificationResponse 콜백에서 

context 없이 navigator 이용을 어찌하나 고민이 많았을 여러분을 위해 !!

최상단이 아닌 _MyApp 에서 MaterialApp 위젯을 호출했다면 그 밑 위젯 (Ex 스플래쉬)에서 didChangeDependencies 혹은  initState 을 오버라이드하여 그 시점에 플러터로컬노티를 초기화 해주면 된다.  

그리고 context를 인자로 받아서 사용하면 끝 !

 

  void initializeNotification(BuildContext context) async {
    // FlutterLocalNotificationsPlugin 인스턴스 생성
    final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

    // Android용 알림 채널 생성
    await flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<
            AndroidFlutterLocalNotificationsPlugin>()
        ?.createNotificationChannel(const AndroidNotificationChannel(
          'high_importance_channel', // 알림 채널 식별자
          'high_importance_notification', // 알림 채널 이름
          importance: Importance.max, // 알림 중요도 최대 설정
        ));

    // iOS 초기화 설정
    DarwinInitializationSettings iosInitializationSettings =
        const DarwinInitializationSettings(
      requestAlertPermission: true, // 알림 권한 요청: Alert
      requestBadgePermission: true, // 알림 권한 요청: Badge
      requestSoundPermission: true, // 알림 권한 요청: Sound
    );

    // 플랫폼별 앱 아이콘으로 알림 표시 설정
    InitializationSettings initializationSettings = InitializationSettings(
      android: const AndroidInitializationSettings("@mipmap/launcher_icon"),
      iOS: iosInitializationSettings,
    );

    // 알림 플러그인 초기화
    await flutterLocalNotificationsPlugin.initialize(
      initializationSettings,
      onDidReceiveNotificationResponse: (detail) async {
        print("포어그라운드에서 알림을 클릭했을 경우 이 함수 실행");
        if (detail.payload == null) return;
        _foregroundMessage(detail.payload!);
      },
    );
  }
  void _foregroundMessage(String communityId) async {
    setAlarm(communityId).whenComplete(() {
      ref.read(pageIndexProvider.notifier).state = 3;
      //  Navigator.of(context)
    });
  }

 context는 인자로 받아놓고 안 썻지만 쓸 수 있다는걸 위해 포함 시켰음. 여기선 그냥 상태관리로 바텀 네비게이션 바꾸어서 페이지 이동했음! 구현은 자신의 프로젝트에 맞게 하시면 되고 "context"가 필요한 경우 이렇게 받아올 수 있다는 설명인데 제 어휘력이 부족한 부분은 댓글 달아주시면 친절하게 설명해드리겠습니다 ㅎㅎ!