Most developers reach for Firebase when they think of notifications in Flutter. But what if your app needs to work offline and you just want to send a reminder, alarm, or alert without setting up a full backend?
In this post, Iβll show you how I implemented local notifications using the flutter_local_notifications package β with zero Firebase and full offline support!
π§ What I Used
- flutter_local_notifications
- permission_handler (for Android 13+ permission)
- A basic Flutter project
π₯ Demo
Here's how it looks in action:
π§± Step-by-Step Implementation
- Add dependencies in pubspec.yaml
dependencies:
flutter:
sdk: flutter
flutter_local_notifications: ^17.0.0
permission_handler: ^11.0.1
- Request Notification Permission (Android 13+)
import 'package:permission_handler/permission_handler.dart';
void requestNotificationPermission() async {
if (await Permission.notification.isDenied) {
await Permission.notification.request();
}
}
Also, add this in AndroidManifest.xml:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
- Initialize the Plugin in main.dart
final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
void main() async {
WidgetsFlutterBinding.ensureInitialized();
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('@mipmap/ic_launcher');
const InitializationSettings initializationSettings =
InitializationSettings(android: initializationSettingsAndroid);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
requestNotificationPermission(); // Ask at startup
runApp(MyApp());
}
- Show a Simple Notification
ElevatedButton(
onPressed: () {
flutterLocalNotificationsPlugin.show(
0,
'Linkedin',
'New jobs for "application developer"',
NotificationDetails(
android: AndroidNotificationDetails(
"channelId",
"localNotification",
importance: Importance.max,
priority: Priority.high,
),
),
);
},
child: Text('local notification'),
)
β
Fix: Enable Core Library Desugaring
Follow these steps:
- Enable desugaring in build.gradle (app-level): Open your android/app/build.gradle file and do the following:
Step 1: Add this in android {} block:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
// Enable desugaring
isCoreLibraryDesugaringEnabled = true
}
Step 2: Add the desugaring dependency in dependencies {}:
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
}
- Sync and Rebuild: Run flutter clean
Then run flutter pub get
Finally, build again:
flutter run or use Android Studioβs run button
β Bonus Tips
- Use @mipmap/ic_launcher or a valid drawable icon β not from assets/.
- You can schedule notifications too using zonedSchedule().
- Works completely offline, perfect for reminders, alarms, and daily alerts!
Top comments (0)