initializeNotifications method
Initialize notifications manually.
Use this when AppConfigBase.fcmAutoInitialize is false and you want to trigger notification setup at a specific point in your app flow.
This method:
- Checks if FCM is enabled in configuration
- Requests notification permissions from the user
- Initializes FCM token management if permission is granted
Returns a NotificationInitResult indicating the outcome:
- NotificationInitResult.success: Permission granted and FCM initialized
- NotificationInitResult.permissionDenied: User denied (may be able to retry on Android)
- NotificationInitResult.permissionPermanentlyDenied: Must use system settings
- NotificationInitResult.permissionRequestBlocked: System blocked the request
- NotificationInitResult.fcmDisabledConfig: FCM disabled in AppConfigBase
- NotificationInitResult.alreadyInitialized: Already initialized
- NotificationInitResult.error: An error occurred
Example:
// After onboarding or at the right moment
final result = await notificationService.initializeNotifications();
if (result == NotificationInitResult.success) {
showSnackbar('Notifications enabled!');
}
Implementation
Future<NotificationInitResult> initializeNotifications() async {
if (!AppConfigBase.useFCM) {
logd('initializeNotifications: FCM is disabled in AppConfigBase');
return NotificationInitResult.fcmDisabledConfig;
}
if (_hasFcmTokenInitialized) {
logd('initializeNotifications: Already initialized');
return NotificationInitResult.alreadyInitialized;
}
try {
// Get status before request to detect blocked requests
final statusBefore = await getPermissionStatus();
// Request permission
final permissionResult = await requestPermissions();
// Check for blocked request (status unchanged from notDetermined)
if (statusBefore == NotificationPermissionStatus.notDetermined &&
permissionResult == NotificationPermissionStatus.notDetermined) {
logw('Permission request may have been blocked by system');
return NotificationInitResult.permissionRequestBlocked;
}
if (permissionResult == NotificationPermissionStatus.authorized ||
permissionResult == NotificationPermissionStatus.provisional) {
// Permission granted - initialize FCM token if callback is set
if (_onTokenChanged != null) {
await initializeFcmToken(onTokenChanged: _onTokenChanged!);
}
logi('Notifications initialized successfully');
return NotificationInitResult.success;
} else if (permissionResult == NotificationPermissionStatus.denied) {
// Check if this is a permanent denial
final canPrompt = await _permissionHelper.canPromptForPermission();
if (!canPrompt) {
return NotificationInitResult.permissionPermanentlyDenied;
}
return NotificationInitResult.permissionDenied;
} else {
return NotificationInitResult.permissionPermanentlyDenied;
}
} catch (e, stackTrace) {
loge(e, 'initializeNotifications failed', stackTrace);
_onError?.call('initializeNotifications failed: $e', stackTrace);
return NotificationInitResult.error;
}
}