import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import '../firebase_options.dart'; import '../config/api_config.dart'; import 'cache_service.dart'; /// Service responsable des initialisations lourdes en tâche de fond. /// /// Objectif : réduire au maximum le travail synchrone dans main(), /// afficher immédiatement une UI minimale, puis effectuer l'init asynchrone. class AppInitializer with ChangeNotifier { bool _isInitialized = false; bool _isInitializing = false; bool get isInitialized => _isInitialized; bool get isInitializing => _isInitializing; final CacheService cacheService = CacheService(); /// Démarre l'initialisation asynchrone. Idempotent. Future initialize() async { if (_isInitialized || _isInitializing) return; _isInitializing = true; scheduleMicrotask(() => notifyListeners()); try { // Initialiser Firebase await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); // Configurer les émulateurs en dev si demandé if (ApiConfig.isDevelopment) { try { await FirebaseAuth.instance.useAuthEmulator('localhost', 9199); FirebaseFirestore.instance.useFirestoreEmulator('localhost', 8088); } catch (e) { // Ignorer si non supporté if (kDebugMode) print('Emulator setup failed: $e'); } } // Initialiser le cache local sans bloquer l'écran de démarrage. unawaited(cacheService.init()); // Précharger des assets critiques de façon asynchrone unawaited(_preloadAssets()); // TODO: lancer ici d'autres initialisations non bloquantes _isInitialized = true; _isInitializing = false; notifyListeners(); } catch (e, st) { if (kDebugMode) print('AppInitializer failed: $e\n$st'); _isInitializing = false; // Ne rethrow pas pour éviter de planter l'app; laisser l'UI gérer les erreurs. notifyListeners(); } } Future _preloadAssets() async { try { // Charger quelques assets en mémoire pour rendre l'affichage initial fluide await rootBundle.load('assets/logos/RectangleLogoBlack.png'); await rootBundle.load('assets/logos/SquareLogoWhite.png'); } catch (e) { if (kDebugMode) print('Preload assets failed: $e'); } } }