import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'router.dart'; import 'theme/app_theme.dart'; import 'providers/providers.dart'; import 'services/audio_service.dart'; import 'services/purchase_service.dart'; import 'screens/splash_screen.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // Load saved theme preference final prefs = await SharedPreferences.getInstance(); final savedTheme = prefs.getString('theme_mode') ?? 'dark'; final themeMode = switch (savedTheme) { 'light' => ThemeMode.light, 'system' => ThemeMode.system, _ => ThemeMode.dark, }; // Initialize audio service AudioService.init(); // Initialize purchase service (loads cached status + starts StoreKit listener) await PurchaseService.instance.initialize(); runApp( ProviderScope( overrides: [ themeModeProvider.overrideWith((ref) => themeMode), // Seed isProProvider from StoreKit cache so first frame is correct. isProProvider.overrideWith((ref) => PurchaseService.instance.isPro), ], child: const PAILotApp(), ), ); } class PAILotApp extends ConsumerStatefulWidget { const PAILotApp({super.key}); @override ConsumerState createState() => _PAILotAppState(); } class _PAILotAppState extends ConsumerState { late final GoRouter _router; bool _showSplash = true; @override void initState() { super.initState(); _router = createRouter(); // Keep isProProvider in sync whenever PurchaseService notifies a change. PurchaseService.instance.addListener(_onPurchaseChanged); } @override void dispose() { PurchaseService.instance.removeListener(_onPurchaseChanged); super.dispose(); } void _onPurchaseChanged() { ref.read(isProProvider.notifier).state = PurchaseService.instance.isPro; } @override Widget build(BuildContext context) { final themeMode = ref.watch(themeModeProvider); return MaterialApp.router( title: 'PAILot', theme: AppTheme.lightTheme, darkTheme: AppTheme.darkTheme, themeMode: themeMode, routerConfig: _router, debugShowCheckedModeBanner: false, builder: (context, child) { return Stack( children: [ child ?? const SizedBox.shrink(), if (_showSplash) SplashScreen(onComplete: () { if (mounted) setState(() => _showSplash = false); }), ], ); }, ); } }