main.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/services.dart';
  3. import 'package:flutter_localizations/flutter_localizations.dart';
  4. import 'l10n/app_localizations.dart';
  5. import 'ui/main_menu.dart';
  6. import 'utils/colors.dart';
  7. import 'utils/settings_manager.dart';
  8. import 'utils/score_manager.dart';
  9. import 'utils/google_play_games_manager.dart';
  10. import 'utils/locale_manager.dart';
  11. import 'utils/app_lifecycle_manager.dart';
  12. import 'game/audio/audio_manager.dart';
  13. void main() async {
  14. WidgetsFlutterBinding.ensureInitialized();
  15. await SettingsManager.init();
  16. await ScoreManager.initialize();
  17. await LocaleManager.init();
  18. // Initialize audio manager early
  19. await AudioManager().initialize();
  20. // Initialize Google Play Games (silent init, don't require sign-in)
  21. await GooglePlayGamesManager.instance.initialize();
  22. // Initialize app lifecycle manager for game suspension
  23. AppLifecycleManager.instance.initialize();
  24. runApp(const ZenTapApp());
  25. }
  26. class ZenTapApp extends StatefulWidget {
  27. const ZenTapApp({super.key});
  28. @override
  29. State<ZenTapApp> createState() => _ZenTapAppState();
  30. }
  31. class _ZenTapAppState extends State<ZenTapApp> with WidgetsBindingObserver {
  32. @override
  33. void initState() {
  34. super.initState();
  35. // Set up locale change callback
  36. LocaleManager.setLocaleChangeCallback(() {
  37. setState(() {});
  38. });
  39. // Add observer for app lifecycle
  40. WidgetsBinding.instance.addObserver(this);
  41. }
  42. @override
  43. void dispose() {
  44. // Remove observer
  45. WidgetsBinding.instance.removeObserver(this);
  46. // Dispose audio manager when app is being terminated
  47. AudioManager().dispose();
  48. // Dispose app lifecycle manager
  49. AppLifecycleManager.instance.dispose();
  50. super.dispose();
  51. }
  52. @override
  53. void didChangeAppLifecycleState(AppLifecycleState state) {
  54. super.didChangeAppLifecycleState(state);
  55. // Handle app termination
  56. if (state == AppLifecycleState.detached) {
  57. // App is being completely terminated, dispose audio immediately
  58. AudioManager().dispose();
  59. }
  60. }
  61. @override
  62. Widget build(BuildContext context) {
  63. return MaterialApp(
  64. title: 'ZenTap',
  65. debugShowCheckedModeBanner: false,
  66. locale: LocaleManager.currentLocale,
  67. localizationsDelegates: const [
  68. AppLocalizations.delegate,
  69. GlobalMaterialLocalizations.delegate,
  70. GlobalWidgetsLocalizations.delegate,
  71. GlobalCupertinoLocalizations.delegate,
  72. ],
  73. supportedLocales: LocaleManager.supportedLocales,
  74. theme: ThemeData(
  75. // Use ZenTap color scheme
  76. colorScheme: ColorScheme.dark(
  77. primary: ZenColors.buttonBackground,
  78. secondary: ZenColors.defaultLink,
  79. surface: ZenColors.uiElements,
  80. onPrimary: ZenColors.buttonText,
  81. onSecondary: ZenColors.white,
  82. onSurface: ZenColors.primaryText,
  83. ),
  84. scaffoldBackgroundColor: ZenColors.appBackground,
  85. appBarTheme: const AppBarTheme(
  86. backgroundColor: ZenColors.appBackground,
  87. foregroundColor: ZenColors.primaryText,
  88. elevation: 0,
  89. systemOverlayStyle: SystemUiOverlayStyle.light,
  90. ),
  91. textTheme: const TextTheme(
  92. bodyLarge: TextStyle(color: ZenColors.primaryText),
  93. bodyMedium: TextStyle(color: ZenColors.primaryText),
  94. bodySmall: TextStyle(color: ZenColors.secondaryText),
  95. titleLarge: TextStyle(color: ZenColors.primaryText),
  96. titleMedium: TextStyle(color: ZenColors.primaryText),
  97. titleSmall: TextStyle(color: ZenColors.primaryText),
  98. ),
  99. elevatedButtonTheme: ElevatedButtonThemeData(
  100. style: ElevatedButton.styleFrom(
  101. backgroundColor: ZenColors.buttonBackground,
  102. foregroundColor: ZenColors.buttonText,
  103. elevation: 4,
  104. shape: RoundedRectangleBorder(
  105. borderRadius: BorderRadius.circular(12),
  106. ),
  107. ),
  108. ),
  109. dialogTheme: DialogThemeData(
  110. backgroundColor: ZenColors.uiElements,
  111. titleTextStyle: const TextStyle(
  112. color: ZenColors.primaryText,
  113. fontSize: 20,
  114. fontWeight: FontWeight.bold,
  115. ),
  116. contentTextStyle: TextStyle(
  117. color: ZenColors.secondaryText,
  118. fontSize: 16,
  119. ),
  120. ),
  121. useMaterial3: true,
  122. ),
  123. home: const MainMenu(),
  124. );
  125. }
  126. }