main function

Future<void> main()

Main function to initialize the app

Implementation

Future<void> main() async {
  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();

  /// GetX Local Storage
  await GetStorage.init();

  /// Await Splash until other items Load
  FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);

  /// Initialize Firebase & Authentication Repository
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform)
      .then((_) {
    Get.put(AuthenticationRepository());
  });

  /// Ensure Firebase authentication is initialized before calling updateFcmTokenIfAuthenticated
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  /// Initialize Deep Links
  await DeepLinkService.initDeepLinks();

  /// Shared Preferences for Locale
  final prefs = await SharedPreferences.getInstance();
  final localeCode = prefs.getString('locale') ?? 'en';

  /// Initialize Messaging & Local Notifications
  // Android
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  const AndroidInitializationSettings initializationSettingsAndroid =
  AndroidInitializationSettings('@mipmap/launcher_icon');
  // iOS TODO: Will not work without Developer Account because of APNS!!! So no push notifications on iOS!!!
  const DarwinInitializationSettings initializationSettingsIOS =
  DarwinInitializationSettings(
    requestAlertPermission: true,
    requestBadgePermission: true,
    requestSoundPermission: true,
  );
  /// Initialize Flutter Local Notifications Plugin
  final InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsIOS,
  );
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  // Register notification channel before any notifications are shown (Android)
  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'friend_request_channel',
    'Friend Request Notifications',
    description: 'Channel for friend request notifications',
    importance: Importance.max,
  );
  await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<
      AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);

  /// Set preferred orientations to portrait only
  /// This is important to ensure the app does not rotate
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
  ]).then((_) {
    runApp(App(initialLocale: Locale(localeCode)));
  });

  /// Initialize Global Overlay
  WidgetsBinding.instance.addPostFrameCallback((_) {
    GlobalExerciseOverlay().init(Get.context!);
  });
}