이번 강의에서는 Flutter 앱에서 저작권 등록 상태를 실시간으로 확인하고, 사용자에게 등록 완료 알림을 표시하는 기능을 구현합니다. FastAPI 서버에서 status가 "registered"로 업데이트되면 Flutter 앱에 반영하여 사용자가 저작권 등록이 완료되었음을 확인할 수 있도록 합니다.
Flutter의 StreamBuilder를 사용하여 Firestore의 등록 상태가 변경될 때 실시간으로 Flutter 앱에 반영합니다. Firestore에서 status 필드가 "registered"로 변경되면 Flutter 앱에서 해당 변경 사항을 확인할 수 있습니다.
Firestore 실시간 데이터 반영
StreamBuilder를 사용해 keywords 컬렉션에서 status가 "registered"인 항목을 확인하여 Flutter 앱에 표시합니다.import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class RegisteredMusicPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Registered Music")),
body: StreamBuilder(
stream: FirebaseFirestore.instance
.collection('keywords')
.where('status', isEqualTo: 'registered')
.snapshots(),
builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
final registeredDocs = snapshot.data!.docs;
return ListView.builder(
itemCount: registeredDocs.length,
itemBuilder: (context, index) {
final doc = registeredDocs[index];
final keyword = doc['keyword'];
final fileUrl = doc['fileUrl'];
return ListTile(
title: Text("Registered: $keyword"),
subtitle: Text("URL: $fileUrl"),
trailing: Icon(Icons.check_circle, color: Colors.green),
);
},
);
},
),
);
}
}
status가 "registered"로 설정된 항목을 실시간으로 가져와 리스트 형태로 표시합니다. 각 항목은 저작권 등록이 완료된 음악 파일을 나타냅니다.Flutter 앱에서 저작권 등록 상태가 업데이트되면 사용자에게 알림을 표시하여 등록 완료를 쉽게 확인할 수 있도록 합니다.
로컬 알림 패키지 설치
flutter_local_notifications 패키지를 설치합니다.dependencies:
flutter_local_notifications: latest_versionflutter pub get 명령어로 패키지를 설치합니다.알림 초기화 설정
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
Future<void> initializeNotifications() async {
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('@mipmap/ic_launcher');
final InitializationSettings initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
Future<void> showNotification(String title, String body) async {
const AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails(
'your_channel_id', 'your_channel_name',
importance: Importance.max, priority: Priority.high, showWhen: false);
const NotificationDetails platformChannelSpecifics =
NotificationDetails(android: androidPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.show(
0, title, body, platformChannelSpecifics);
}
Firestore 변경 감지 및 알림 표시
StreamBuilder를 사용하여 Firestore에서 status가 "registered"로 변경된 항목을 감지하고, 해당 항목에 대해 알림을 표시합니다.import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class MusicNotificationPage extends StatefulWidget {
_MusicNotificationPageState createState() => _MusicNotificationPageState();
}
class _MusicNotificationPageState extends State<MusicNotificationPage> {
void initState() {
super.initState();
initializeNotifications();
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Music Notifications")),
body: StreamBuilder(
stream: FirebaseFirestore.instance
.collection('keywords')
.where('status', isEqualTo: 'registered')
.snapshots(),
builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
final registeredDocs = snapshot.data!.docs;
return ListView.builder(
itemCount: registeredDocs.length,
itemBuilder: (context, index) {
final doc = registeredDocs[index];
final keyword = doc['keyword'];
// 알림 표시
showNotification(
"Copyright Registered",
"The music for keyword '$keyword' is now registered!",
);
return ListTile(
title: Text("Registered: $keyword"),
trailing: Icon(Icons.check_circle, color: Colors.green),
);
},
);
},
),
);
}
}
showNotification 함수는 status가 "registered"로 변경된 항목에 대해 알림을 표시하여 사용자에게 저작권 등록 완료를 알립니다.Registered: [키워드] 형식으로 알림이 전송됩니다.status가 "registered"로 변경될 때 실시간으로 확인할 수 있도록 StreamBuilder를 사용했습니다.다음 강의에서는 프로젝트 배포 및 유지 관리를 통해 FastAPI 서버와 Flutter 앱을 클라우드 및 앱 마켓에 배포하고, Firebase를 통한 성능 최적화와 유지 관리 방법을 다루겠습니다.