Matthias Nott
2026-04-05 3233e3046d8922a6f948e0dbd74216d1943df31b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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';
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<PAILotApp> createState() => _PAILotAppState();
}
class _PAILotAppState extends ConsumerState<PAILotApp> {
  late final GoRouter _router;
  @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,
    );
  }
}