Add notification permission flow in settings

This commit is contained in:
Rijad Zuzo
2026-02-15 23:53:46 +01:00
parent 6e73273ede
commit 560716100d
7 changed files with 144 additions and 1 deletions
@@ -7,6 +7,9 @@ abstract class ReminderScheduler {
/// Clears all platform-scheduled reminder jobs.
Future<void> clearAll();
/// Requests notification permissions where the platform requires them.
Future<bool> requestPermissions();
}
/// Default scheduler used until platform notifications are integrated.
@@ -18,4 +21,7 @@ class NoopReminderScheduler implements ReminderScheduler {
@override
Future<void> reconcile(List<ReminderRule> reminders) async {}
@override
Future<bool> requestPermissions() async => true;
}
@@ -59,6 +59,15 @@ class LocalNotificationsReminderScheduler implements ReminderScheduler {
}
}
@override
Future<bool> requestPermissions() async {
if (!_supportsSchedulingPlatform()) {
return false;
}
await _driver.ensureInitialized();
return _driver.requestPermissions();
}
DateTimeComponents? _repeatComponents(ReminderCadence cadence) {
return switch (cadence) {
ReminderCadence.daily => DateTimeComponents.time,
@@ -107,6 +116,8 @@ abstract class ReminderNotificationsDriver {
required DateTimeComponents? repeatComponents,
required String payload,
});
Future<bool> requestPermissions();
}
class FlutterReminderNotificationsDriver
@@ -148,6 +159,38 @@ class FlutterReminderNotificationsDriver
);
}
@override
Future<bool> requestPermissions() async {
if (defaultTargetPlatform == TargetPlatform.android) {
return await _plugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin
>()
?.requestNotificationsPermission() ??
false;
}
if (defaultTargetPlatform == TargetPlatform.iOS) {
return await _plugin
.resolvePlatformSpecificImplementation<
IOSFlutterLocalNotificationsPlugin
>()
?.requestPermissions(alert: true, badge: true, sound: true) ??
false;
}
if (defaultTargetPlatform == TargetPlatform.macOS) {
return await _plugin
.resolvePlatformSpecificImplementation<
MacOSFlutterLocalNotificationsPlugin
>()
?.requestPermissions(alert: true, badge: true, sound: true) ??
false;
}
return true;
}
Future<void> _initialize() async {
await _plugin.initialize(
settings: const InitializationSettings(