fluxy_notifications
Push and local notifications plugin for the Fluxy framework, providing comprehensive notification management with support for local notifications, scheduled notifications, and push notification handling.
Installation
Add this to your package's pubspec.yaml file:
dependencies:
fluxy_notifications: ^1.0.0
Usage
First, ensure you have Fluxy initialized and the notifications plugin registered:
import 'package:fluxy/fluxy.dart';
void main() async {
await Fluxy.init();
Fluxy.autoRegister(); // Registers all available plugins including notifications
runApp(MyApp());
}
Basic Notification Operations
import 'package:fluxy/fluxy.dart';
class NotificationService {
// Initialize notifications
Future<void> initializeNotifications() async {
try {
await Fx.notifications.initialize();
Fx.toast.success('Notifications initialized');
} catch (e) {
Fx.toast.error('Notification initialization failed: $e');
}
}
// Show simple notification
Future<void> showSimpleNotification() async {
try {
await Fx.notifications.show(
title: 'Hello',
body: 'This is a simple notification',
payload: 'simple_notification',
);
Fx.toast.success('Notification sent');
} catch (e) {
Fx.toast.error('Failed to send notification: $e');
}
}
// Show notification with actions
Future<void> showNotificationWithActions() async {
try {
await Fx.notifications.show(
title: 'New Message',
body: 'You have received a new message',
payload: 'new_message',
actions: [
NotificationAction(
key: 'reply',
title: 'Reply',
),
NotificationAction(
key: 'mark_read',
title: 'Mark as Read',
),
],
);
Fx.toast.success('Notification with actions sent');
} catch (e) {
Fx.toast.error('Failed to send notification: $e');
}
}
// Schedule notification
Future<void> scheduleNotification() async {
try {
await Fx.notifications.schedule(
id: 1,
title: 'Reminder',
body: 'This is a scheduled notification',
scheduledTime: DateTime.now().add(Duration(minutes: 5)),
payload: 'scheduled_notification',
);
Fx.toast.success('Notification scheduled');
} catch (e) {
Fx.toast.error('Failed to schedule notification: $e');
}
}
}
Advanced Notification Features
class AdvancedNotificationService {
// Show notification with custom style
Future<void> showStyledNotification() async {
try {
await Fx.notifications.show(
title: 'Styled Notification',
body: 'This notification has custom styling',
payload: 'styled_notification',
style: NotificationStyle.bigPicture,
largeIcon: 'assets/images/notification_icon.png',
bigPicture: 'assets/images/notification_image.png',
color: Colors.blue,
importance: NotificationImportance.high,
priority: NotificationPriority.high,
);
Fx.toast.success('Styled notification sent');
} catch (e) {
Fx.toast.error('Failed to send styled notification: $e');
}
}
// Show progress notification
Future<void> showProgressNotification() async {
try {
await Fx.notifications.show(
title: 'Download Progress',
body: 'Downloading file...',
payload: 'download_progress',
progress: 0,
maxProgress: 100,
indeterminate: false,
ongoing: true,
autoCancel: false,
);
// Update progress
for (int i = 0; i <= 100; i += 10) {
await Fx.notifications.updateProgress(
id: 1,
progress: i,
body: 'Downloading file... $i%',
);
await Future.delayed(Duration(seconds: 1));
}
// Complete notification
await Fx.notifications.updateProgress(
id: 1,
progress: 100,
title: 'Download Complete',
body: 'File downloaded successfully',
ongoing: false,
);
Fx.toast.success('Progress notification completed');
} catch (e) {
Fx.toast.error('Failed to show progress notification: $e');
}
}
// Show grouped notifications
Future<void> showGroupedNotifications() async {
try {
// Show multiple notifications in a group
await Fx.notifications.show(
id: 1,
title: 'New Email 1',
body: 'You have a new email from sender1@example.com',
payload: 'email_1',
groupKey: 'emails',
isGroupSummary: false,
);
await Fx.notifications.show(
id: 2,
title: 'New Email 2',
body: 'You have a new email from sender2@example.com',
payload: 'email_2',
groupKey: 'emails',
isGroupSummary: false,
);
// Show group summary
await Fx.notifications.show(
id: 0,
title: 'New Emails',
body: 'You have 2 new emails',
payload: 'email_summary',
groupKey: 'emails',
isGroupSummary: true,
);
Fx.toast.success('Grouped notifications sent');
} catch (e) {
Fx.toast.error('Failed to send grouped notifications: $e');
}
}
}
Notification Management
class NotificationManagementService {
// Cancel specific notification
Future<void> cancelNotification(int id) async {
try {
await Fx.notifications.cancel(id);
Fx.toast.success('Notification cancelled');
} catch (e) {
Fx.toast.error('Failed to cancel notification: $e');
}
}
// Cancel all notifications
Future<void> cancelAllNotifications() async {
try {
await Fx.notifications.cancelAll();
Fx.toast.success('All notifications cancelled');
} catch (e) {
Fx.toast.error('Failed to cancel all notifications: $e');
}
}
// Get pending notifications
Future<List<PendingNotification>> getPendingNotifications() async {
try {
final notifications = await Fx.notifications.getPendingNotifications();
return notifications;
} catch (e) {
Fx.toast.error('Failed to get pending notifications: $e');
return [];
}
}
// Check notification permission
Future<bool> checkNotificationPermission() async {
try {
final isGranted = await Fx.notifications.isPermissionGranted();
if (!isGranted) {
final granted = await Fx.notifications.requestPermission();
if (granted) {
Fx.toast.success('Notification permission granted');
} else {
Fx.toast.error('Notification permission denied');
}
return granted;
}
return true;
} catch (e) {
Fx.toast.error('Failed to check notification permission: $e');
return false;
}
}
}
Notification Channels (Android)
class NotificationChannelService {
// Create notification channel
Future<void> createNotificationChannel() async {
try {
await Fx.notifications.createChannel(
id: 'important_channel',
name: 'Important Notifications',
description: 'Channel for important notifications',
importance: NotificationImportance.high,
sound: 'notification_sound.mp3',
vibrationPattern: [0, 1000, 500, 1000],
enableLights: true,
enableVibration: true,
ledColor: Colors.red,
);
Fx.toast.success('Notification channel created');
} catch (e) {
Fx.toast.error('Failed to create notification channel: $e');
}
}
// Update notification channel
Future<void> updateNotificationChannel() async {
try {
await Fx.notifications.updateChannel(
id: 'important_channel',
name: 'Updated Important Notifications',
description: 'Updated channel for important notifications',
importance: NotificationImportance.max,
);
Fx.toast.success('Notification channel updated');
} catch (e) {
Fx.toast.error('Failed to update notification channel: $e');
}
}
// Delete notification channel
Future<void> deleteNotificationChannel() async {
try {
await Fx.notifications.deleteChannel('important_channel');
Fx.toast.success('Notification channel deleted');
} catch (e) {
Fx.toast.error('Failed to delete notification channel: $e');
}
}
}
Features
- Local Notifications: Show immediate local notifications
- Scheduled Notifications: Schedule notifications for specific times
- Notification Actions: Add interactive actions to notifications
- Progress Notifications: Show progress in notifications
- Grouped Notifications: Group related notifications
- Notification Channels: Android notification channel support
- Custom Styling: Customize notification appearance
- Permission Management: Handle notification permissions
- Cross-Platform: Works on both iOS and Android
API Reference
Methods
initialize()- Initialize notification serviceshow()- Show immediate notificationschedule()- Schedule notification for latercancel(int id)- Cancel specific notificationcancelAll()- Cancel all notificationsgetPendingNotifications()- Get list of pending notificationsisPermissionGranted()- Check notification permissionrequestPermission()- Request notification permissioncreateChannel()- Create notification channel (Android)updateChannel()- Update notification channel (Android)deleteChannel()- Delete notification channel (Android)
Notification Properties
title- Notification titlebody- Notification body textpayload- Custom payload dataactions- List of notification actionsstyle- Notification style (default, big picture, big text)importance- Notification importance levelpriority- Notification prioritycolor- Notification colorlargeIcon- Large notification iconbigPicture- Big picture for big picture style
Error Handling
The notifications plugin provides comprehensive error handling:
try {
await Fx.notifications.show(title: 'Test', body: 'Test notification');
} on NotificationException catch (e) {
// Handle specific notification errors
switch (e.type) {
case NotificationErrorType.permissionDenied:
Fx.toast.error('Notification permission denied');
break;
case NotificationErrorType.schedulingFailed:
Fx.toast.error('Failed to schedule notification');
break;
case NotificationErrorType.channelError:
Fx.toast.error('Notification channel error');
break;
default:
Fx.toast.error('Notification error: $e');
}
} catch (e) {
Fx.toast.error('Unexpected notification error: $e');
}
Platform Configuration
Android
Add the following to your AndroidManifest.xml:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
iOS
Add the following to your Info.plist:
<key>UIBackgroundModes</key>
<array>
<string>background-fetch</string>
<string>remote-notification</string>
</array>
Security Considerations
- All notification content is handled securely
- Permission requests require explicit user consent
- Sensitive data in payloads should be encrypted
- Notification channels are properly managed
- No unauthorized background notifications
License
This package is licensed under the MIT License. See the LICENSE file for details.