flutter_firebase_push_notification_provider 1.0.0
flutter_firebase_push_notification_provider: ^1.0.0 copied to clipboard
A Flutter package that provides a unified interface for Firebase Cloud Messaging (FCM) push notifications. Handles permissions, token management, and message routing across all app states.
example/example.dart
import 'dart:async';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_firebase_push_notification_provider/flutter_firebase_push_notification_provider.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize Firebase first
await Firebase.initializeApp();
// Initialize the notification provider
final notificationProvider = FlutterFirebasePushNotificationProvider();
await notificationProvider.initialize(
onTokenRefresh: (token, deviceInfo) async {
// Send token to your server
// Example: await myApi.updatePushToken(userId, token, deviceInfo.toMap());
debugPrint('Token: $token');
debugPrint('Device: ${deviceInfo.deviceName}');
},
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: NotificationExample(),
);
}
}
class NotificationExample extends StatefulWidget {
const NotificationExample({super.key});
@override
State<NotificationExample> createState() => _NotificationExampleState();
}
class _NotificationExampleState extends State<NotificationExample> {
final _provider = FlutterFirebasePushNotificationProvider();
StreamSubscription<Map<String, dynamic>>? _subscription;
String _lastMessage = 'No messages yet';
@override
void initState() {
super.initState();
_listenToMessages();
}
void _listenToMessages() {
if (_provider.isInitialized) {
_subscription = _provider.messagesStream.listen((message) {
setState(() {
final title = message['notification']?['title'] ?? 'No title';
final body = message['notification']?['body'] ?? 'No body';
_lastMessage = '$title: $body';
});
});
}
}
@override
void dispose() {
_subscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Push Notifications'),
),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Initialized: ${_provider.isInitialized}'),
const SizedBox(height: 8),
Text('Has Permission: ${_provider.hasPermission}'),
const SizedBox(height: 8),
Text('Token: ${_provider.currentToken.isEmpty ? "Not available" : "${_provider.currentToken.substring(0, 20)}..."}'),
const SizedBox(height: 24),
const Text(
'Last Message:',
style: TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text(_lastMessage),
const Spacer(),
ElevatedButton(
onPressed: () async {
// Delete token on logout
await _provider.deleteToken();
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Token deleted')),
);
}
},
child: const Text('Delete Token (Logout)'),
),
],
),
),
);
}
}