목차

  1. 사용 예시

 

 

 

✅ 사용 예시

 

1️⃣ pubspec.yaml 설정

 

 

2️⃣ 기타 설정

  • android / app / src / main / AndroidManifest.xml
  • ios / Runner / AppDelegate.swift

 

 

3️⃣ 알림.dart

 

 

4️⃣ main.dart



5️⃣ 테스트

 

 

 

 

✔️ 사용된 코드

1️⃣ 알림.dart

import 'dart:async';

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class FlutterLocalNotification{
  FlutterLocalNotification._(); // private 생성자 (외부에서 FlutterLocalNotification() 으로 객체 생성 못하게 막음)

  // flutterLocalNotificationsPlugin : 플랫폼 별 알림을 등록/관리/표시 (싱글톤 형태로, 앱 전체에서 하나만 공유됨)
  static FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();

  // 앱 초기화
  static init() async{
    // Android 초기 설정
    AndroidInitializationSettings initializationSettingsAndroid =
        const AndroidInitializationSettings('mipmap/ic_launcher');  // 'mipmap/ic_launcher' : 앱 실행 시 알림 아이콘으로 쓸 리소스 지정
    // iOS 초기 설정
    DarwinInitializationSettings iosInitializationSettings =
        const DarwinInitializationSettings( // 각각의 권한 요청 여부를 설정
          requestAlertPermission: false,
          requestBadgePermission: false,
          requestSoundPermission: false,
        );

    // 플랫폼 별(Android, iOS) 세팅 설정을 통합
    InitializationSettings initializationSettings = InitializationSettings(
      android: initializationSettingsAndroid,
      iOS: iosInitializationSettings,
    );

    // flutterLocalNotificationsPlugin 인스턴스 초기화
    // 알람을 띄울 떄 사용되는 객체
    await flutterLocalNotificationsPlugin.initialize(initializationSettings);
  }

  // 권한 설정
  // IOSFlutterLocalNotificationsPlugin : iOS 전용 API (Android에서 실행하면 null 리턴)
  static requestNotificationPermission() {
    flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()
        ?.requestPermissions(
          alert: true,  // 알림 배너
          badge: true,  // 앱 아이콘에 숫자 배지 표시
          sound: true   // 알림 소리
        );
  }

  // 알림 띄우기
  static Future<void> showNotification() async {
    // Android 알림 상세 설정
    const AndroidNotificationDetails androidNotificationDetails =
      AndroidNotificationDetails('channel_id', 'channel_name',
        channelDescription: 'channel description',
        importance: Importance.max,
        priority: Priority.high,
        showWhen: false
      );
    // 플랫폼 별(Android, iOS) 알림 설정을 통합
    // iOS 알림 상세 설정은 '앱 아이콘에 빨란 배지 숫자 1 표시' 하나만 사용
    const NotificationDetails notificationDetails = NotificationDetails(
      android: androidNotificationDetails,
      iOS: DarwinNotificationDetails(badgeNumber: 1)
    );
    // 실제 알림을 화면에 띄움
    await flutterLocalNotificationsPlugin.show(
      0,                   // 알림ID (고유값으로 추후 취소할 떄 필요)
      'test title',       // 알림 제목
      'test body',        // 알림 내용
      notificationDetails // 위에서 만든 플랫폼 별 통합 알림 설정 메소드
    );
  }
}

 

2️⃣ main.dart

import 'package:flutter/material.dart';
import 'notification.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // 네이티브 채널 초기화
  await FlutterLocalNotification.init(); // init도 main에서 호출 권장
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  void initState() {
    // 초기화
    FlutterLocalNotification.init();
    // 3초 후 권한 요청
    Future.delayed(const Duration(seconds: 3), () {
      FlutterLocalNotification.requestNotificationPermission();
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: TextButton(
          onPressed: () => FlutterLocalNotification.showNotification(),
          child: const Text("알림 보내기"),
        ),
      ),
    );
  }
}

 

 

+ Recent posts