/// UnionFlow - Application Mobile Révolutionnaire /// /// Point d'entrée principal avec système d'authentification adaptatif /// Architecture ultra-sophistiquée avec dashboard morphique basé sur les rôles library main; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'app/app.dart'; import 'core/config/environment.dart'; import 'core/l10n/locale_provider.dart'; import 'core/theme/theme_provider.dart'; import 'core/di/injection.dart'; import 'core/security/app_integrity_service.dart'; import 'core/utils/logger.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); AppConfig.initialize(); GoogleFonts.config.allowRuntimeFetching = !AppConfig.isProd; // Initialisation unique et automatique (DRY) await configureDependencies(); // Surveillance intégrité applicative MASVS v2 RESILIENCE await AppIntegrityService.instance.initialize( onThreatDetected: (threat) => AppLogger.warning('Threat detected: $threat', tag: 'Security'), ); // Mode immersif et config système await _configureApp(); final localeProvider = LocaleProvider(); await localeProvider.initialize(); final themeProvider = await ThemeProvider.load(); if (AppConfig.enableCrashReporting && AppConfig.sentryDsn.isNotEmpty) { await SentryFlutter.init( (options) { options.dsn = AppConfig.sentryDsn; options.environment = AppConfig.environment.name; options.tracesSampleRate = AppConfig.isProd ? 0.2 : 1.0; options.debug = AppConfig.enableDebugMode; options.sendDefaultPii = false; }, appRunner: () => runApp( DefaultAssetBundle( bundle: SentryAssetBundle(), child: UnionFlowApp(localeProvider: localeProvider, themeProvider: themeProvider), ), ), ); } else { runApp(UnionFlowApp(localeProvider: localeProvider, themeProvider: themeProvider)); } } /// Configure les paramètres globaux de l'application Future _configureApp() async { // Configuration de l'orientation await SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]); // Configuration de la barre de statut - Mode immersif edge-to-edge // Les icônes s'adaptent automatiquement via AppBarTheme.systemOverlayStyle dans chaque thème SystemChrome.setSystemUIOverlayStyle( const SystemUiOverlayStyle( statusBarColor: Colors.transparent, systemNavigationBarColor: Colors.transparent, // Transparent pour edge-to-edge systemNavigationBarDividerColor: Colors.transparent, ), ); // Activer le mode edge-to-edge (immersif) SystemChrome.setEnabledSystemUIMode( SystemUiMode.edgeToEdge, ); }