Flutter Local Notifications Example
This article explains you how you can trigger local notifications in your flutter application. You can also check out firebase related articles.
Local notification is a way to inform or alert user about some information without use of internet. In this example, we are using flutter local notifications package to integrate local notification in both android and iOS platforms.
Add below dependency in your pubspec.yaml file
Flutter Local Notifications Changes in Android Platform
For local notifications in android, We need to add following permissions in android manifest file.
<uses-permission android:name=”android.permission.VIBRATE” />
We also need to add receivers in android manifest file. Add below lines under application tag in AndroidManifest.xml.
<intent-filter>
<action android:name=”android.intent.action.BOOT_COMPLETED”></action>
</intent-filter>
</receiver>
<receiver android:name=”com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver” />
Request Permissions For Flutter Local Notifications In iOS Platform
We need to ask notification permission for iOS users to integrate local notifications.
flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation
<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(
alert: true,
badge: true,
sound: true,
);
}
Initialize Flutter Local Notifications
First we initialize notification settings for android and iOS platform separately. For android platform, We must specify notification icon name otherwise notification will not be shown in android platform. Notification icon must be places under android res/drawable folder.
For iOS platform, You can set sound, badge and alert permissions as below. You can also specify function to onSelectNotification parameter to display new screen on click of notification. You can also pass information to new screen.
void initState() {
super.initState();
var androidSettings = AndroidInitializationSettings(‘app_icon’);
var iOSSettings = IOSInitializationSettings(
requestSoundPermission: false,
requestBadgePermission: false,
requestAlertPermission: false,
);
var initSetttings = InitializationSettings(androidSettings, iOSSettings);
flutterLocalNotificationsPlugin.initialize(initSetttings, onSelectNotification: onClickNotification);
}
Future onClickNotification(String payload) {
Navigator.of(context).push(MaterialPageRoute(builder: (_) {
return DestinationScreen(
payload: payload,
);
}));
}
Simple Notification
You can specify particular notification settings for android and iOS platform as below. For android platform, You need to set notification channel id, name and description. You can also set priority and importance of notification in android platform.
Flutter local notification provides show method in which there are different parameters. Here you can set notification title, body and platform settings. You can also pass information to new screen with this payload parameter.
var androidDetails = AndroidNotificationDetails(‘id’, ‘channel ‘, ‘description’,
priority: Priority.High, importance: Importance.Max);
var iOSDetails = IOSNotificationDetails();
var platformDetails = new NotificationDetails(androidDetails, iOSDetails);
await flutterLocalNotificationsPlugin.show(0, ‘Flutter Local Notification’, ‘Flutter Simple Notification’,
platformDetails, payload: ‘Destination Screen (Simple Notification)’);
}
Schedule Notification
You can schedule notification after certain amount of time using schedule method for once. Here we schedule local notification after five seconds. Other parameters are same as simple notification.
var scheduledNotificationDateTime = DateTime.now().add(Duration(seconds: 5));
var androidDetails = AndroidNotificationDetails(
‘channel_id’,
‘Channel Name’,
‘Channel Description’,
icon: ‘app_icon’,
largeIcon: DrawableResourceAndroidBitmap(‘app_icon’),
);
var iOSDetails = IOSNotificationDetails();
var platformDetails = NotificationDetails(androidDetails, iOSDetails);
await flutterLocalNotificationsPlugin.schedule(0, ‘Flutter Local Notification’, ‘Flutter Schedule Notification’, scheduledNotificationDateTime, platformDetails, payload: ‘Destination Screen(Schedule Notification)’);
}
Periodic Notification
You can schedule notification after certain amount of time periodically using periodicallyShow method. Here we schedule push notification after every minute.
const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(‘channel_id’, ‘Channel Name’, ‘Channel Description’);
const NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null);
await flutterLocalNotificationsPlugin.periodicallyShow(0, ‘Flutter Local Notification’, ‘Flutter Periodic Notification’, RepeatInterval.EveryMinute, notificationDetails, payload: ‘Destination Screen(Periodic Notification)’);
}
Picture Notification
You can display only picture notification in android platform as below.
var bigPictureStyleInformation = BigPictureStyleInformation(
DrawableResourceAndroidBitmap(“cover_image”),
largeIcon: DrawableResourceAndroidBitmap(“app_icon”),
contentTitle: ‘Flutter Big Picture Notification Title’,
summaryText: ‘Flutter Big Picture Notification Summary Text’,
);
var androidDetails = AndroidNotificationDetails(
‘channel_id’,
‘Channel Name’,
‘Channel Description’,
styleInformation: bigPictureStyleInformation);
var platformDetails = NotificationDetails(androidDetails, null);
await flutterLocalNotificationsPlugin.show(0, ‘Flutter Local Notification’, ‘Flutter Big Picture Notification’, platformDetails, payload: ‘Destination Screen(Big Picture Notification)’);
}
Multiline Text Notification
You can display multiple text lines notification.
const BigTextStyleInformation bigTextStyleInformation = BigTextStyleInformation(
‘Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.’,
htmlFormatBigText: true,
contentTitle: ‘Flutter Big Text Notification Title’,
htmlFormatContentTitle: true,
summaryText: ‘Flutter Big Text Notification Summary Text’,
htmlFormatSummaryText: true,
);
const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(‘channel_id’, ‘Channel Name’, ‘Channel Description’, styleInformation: bigTextStyleInformation);
const NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null);
await flutterLocalNotificationsPlugin.show(0, ‘Flutter Local Notification’, ‘Flutter Big Text Notification’, notificationDetails, payload: ‘Destination Screen(Big Text Notification)’);
}
Insistent Notification
You can also trigger notification continuously as below.
const int insistentFlag = 4;
final AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails(‘channel_id’, ‘Channel Name’, ‘Channel Description’,
importance: Importance.Max,
priority: Priority.High,
ticker: ‘ticker’,
additionalFlags: Int32List.fromList(<int>[insistentFlag]));
final NotificationDetails notificationDetails = NotificationDetails(androidPlatformChannelSpecifics, null);
await flutterLocalNotificationsPlugin.show(0, ‘Flutter Local Notification’, ‘Flutter Insistent Notification’, notificationDetails, payload: ‘Destination Screen(Insistent Notification)’);
}
Ongoing Notification
Ongoing notification is used to notify user that task is running like foreground service. This type of notification you can not be clear.
const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(‘channel_id’, ‘Channel Name’, ‘Channel Description’,
importance: Importance.Max,
priority: Priority.High,
ongoing: true,
autoCancel: false);
const NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null);
await flutterLocalNotificationsPlugin.show(0, ‘Flutter Local Notification’, ‘Flutter Ongoing Notification’, notificationDetails, payload: ‘Destination Screen(Ongoing Notification)’);
}
Progress Notification
In this notification, you can display progress of particular task.
const int maxProgress = 5;
for (int i = 0; i <= maxProgress; i++) {
await Future<void>.delayed(const Duration(seconds: 1), () async {
final AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(‘channel_id’, ‘Channel Name’, ‘Channel Description’,
channelShowBadge: false,
importance: Importance.Max,
priority: Priority.High,
onlyAlertOnce: true,
showProgress: true,
maxProgress: maxProgress,
progress: i);
final NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null);
await flutterLocalNotificationsPlugin.show(0, ‘Flutter Local Notification’, ‘Flutter Progress Notification’, notificationDetails, payload: ‘Destination Screen(Progress Notification)’);
});
}
}
Final Code For Flutter Local Notifications
import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutterlocalnotifications/destination_screen.dart'; class LocalNotifications extends StatefulWidget { String title; LocalNotifications({this.title}); @override _LocalNotificationsState createState() => _LocalNotificationsState(); } class _LocalNotificationsState extends State<LocalNotifications> { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); @override void initState() { super.initState(); requestPermissions(); var androidSettings = AndroidInitializationSettings('app_icon'); var iOSSettings = IOSInitializationSettings( requestSoundPermission: false, requestBadgePermission: false, requestAlertPermission: false, ); var initSetttings = InitializationSettings(androidSettings, iOSSettings); flutterLocalNotificationsPlugin.initialize(initSetttings, onSelectNotification: onClickNotification); } void requestPermissions() { flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions( alert: true, badge: true, sound: true, ); } Future onClickNotification(String payload) { Navigator.of(context).push(MaterialPageRoute(builder: (_) { return DestinationScreen( payload: payload, ); })); } showSimpleNotification() async { var androidDetails = AndroidNotificationDetails('id', 'channel ', 'description', priority: Priority.High, importance: Importance.Max); var iOSDetails = IOSNotificationDetails(); var platformDetails = new NotificationDetails(androidDetails, iOSDetails); await flutterLocalNotificationsPlugin.show(0, 'Flutter Local Notification', 'Flutter Simple Notification', platformDetails, payload: 'Destination Screen (Simple Notification)'); } Future<void> showScheduleNotification() async { var scheduledNotificationDateTime = DateTime.now().add(Duration(seconds: 5)); var androidDetails = AndroidNotificationDetails( 'channel_id', 'Channel Name', 'Channel Description', icon: 'app_icon', largeIcon: DrawableResourceAndroidBitmap('app_icon'), ); var iOSDetails = IOSNotificationDetails(); var platformDetails = NotificationDetails(androidDetails, iOSDetails); await flutterLocalNotificationsPlugin.schedule(0, 'Flutter Local Notification', 'Flutter Schedule Notification', scheduledNotificationDateTime, platformDetails, payload: 'Destination Screen(Schedule Notification)'); } Future<void> showPeriodicNotification() async { const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails('channel_id', 'Channel Name', 'Channel Description'); const NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null); await flutterLocalNotificationsPlugin.periodicallyShow(0, 'Flutter Local Notification', 'Flutter Periodic Notification', RepeatInterval.EveryMinute, notificationDetails, payload: 'Destination Screen(Periodic Notification)'); } Future<void> showBigPictureNotification() async { var bigPictureStyleInformation = BigPictureStyleInformation( DrawableResourceAndroidBitmap("cover_image"), largeIcon: DrawableResourceAndroidBitmap("app_icon"), contentTitle: 'Flutter Big Picture Notification Title', summaryText: 'Flutter Big Picture Notification Summary Text', ); var androidDetails = AndroidNotificationDetails( 'channel_id', 'Channel Name', 'Channel Description', styleInformation: bigPictureStyleInformation); var platformDetails = NotificationDetails(androidDetails, null); await flutterLocalNotificationsPlugin.show(0, 'Flutter Local Notification', 'Flutter Big Picture Notification', platformDetails, payload: 'Destination Screen(Big Picture Notification)'); } Future<void> showBigTextNotification() async { const BigTextStyleInformation bigTextStyleInformation = BigTextStyleInformation( 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', htmlFormatBigText: true, contentTitle: 'Flutter Big Text Notification Title', htmlFormatContentTitle: true, summaryText: 'Flutter Big Text Notification Summary Text', htmlFormatSummaryText: true, ); const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails('channel_id', 'Channel Name', 'Channel Description', styleInformation: bigTextStyleInformation); const NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null); await flutterLocalNotificationsPlugin.show(0, 'Flutter Local Notification', 'Flutter Big Text Notification', notificationDetails, payload: 'Destination Screen(Big Text Notification)'); } Future<void> showInsistentNotification() async { const int insistentFlag = 4; final AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails('channel_id', 'Channel Name', 'Channel Description', importance: Importance.Max, priority: Priority.High, ticker: 'ticker', additionalFlags: Int32List.fromList(<int>[insistentFlag])); final NotificationDetails notificationDetails = NotificationDetails(androidPlatformChannelSpecifics, null); await flutterLocalNotificationsPlugin.show(0, 'Flutter Local Notification', 'Flutter Insistent Notification', notificationDetails, payload: 'Destination Screen(Insistent Notification)'); } Future<void> showOngoingNotification() async { const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails('channel_id', 'Channel Name', 'Channel Description', importance: Importance.Max, priority: Priority.High, ongoing: true, autoCancel: false); const NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null); await flutterLocalNotificationsPlugin.show(0, 'Flutter Local Notification', 'Flutter Ongoing Notification', notificationDetails, payload: 'Destination Screen(Ongoing Notification)'); } Future<void> showProgressNotification() async { const int maxProgress = 5; for (int i = 0; i <= maxProgress; i++) { await Future<void>.delayed(const Duration(seconds: 1), () async { final AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails('channel_id', 'Channel Name', 'Channel Description', channelShowBadge: false, importance: Importance.Max, priority: Priority.High, onlyAlertOnce: true, showProgress: true, maxProgress: maxProgress, progress: i); final NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null); await flutterLocalNotificationsPlugin.show(0, 'Flutter Local Notification', 'Flutter Progress Notification', notificationDetails, payload: 'Destination Screen(Progress Notification)'); }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(widget.title)), body: Container( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ RaisedButton( child: Text('Simple Notification'), onPressed: () => showSimpleNotification(), ), SizedBox(height: 15), RaisedButton( child: Text('Schedule Notification'), onPressed: () => showScheduleNotification(), ), SizedBox(height: 15), RaisedButton( child: Text('Periodic Notification'), onPressed: () => showPeriodicNotification(), ), SizedBox(height: 15), RaisedButton( child: Text('Big Picture Notification'), onPressed: () => showBigPictureNotification(), ), SizedBox(height: 15), RaisedButton( child: Text('Big Text Notification'), onPressed: () => showBigTextNotification(), ), SizedBox(height: 15), RaisedButton( child: Text('Insistent Notification'), onPressed: () => showInsistentNotification(), ), SizedBox(height: 15), RaisedButton( child: Text('OnGoing Notification'), onPressed: () => showOngoingNotification(), ), SizedBox(height: 15), RaisedButton( child: Text('Progress Notification'), onPressed: () => showProgressNotification(), ), ], ), ), ), ); } }
import 'package:flutter/material.dart'; class DestinationScreen extends StatelessWidget { String payload; DestinationScreen({this.payload}); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Padding(padding: EdgeInsets.all(25),child: Text(payload, textAlign: TextAlign.center, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 30,))), ) ); } }







Pingback: Flutter Animated ListView Example - CodingWithDhrumil