import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:minehunter/common/cubit/nav/nav_cubit_pages.dart'; import 'package:minehunter/common/cubit/nav/nav_cubit_screens.dart'; import 'package:minehunter/config/application_config.dart'; import 'package:minehunter/config/default_global_settings.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart'; import 'package:minehunter/cubit/settings/settings_activity_cubit.dart'; import 'package:minehunter/cubit/settings/settings_global_cubit.dart'; import 'package:minehunter/ui/skeleton.dart'; void main() async { // Initialize packages WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); final Directory tmpDir = await getTemporaryDirectory(); Hive.init(tmpDir.toString()); HydratedBloc.storage = await HydratedStorage.build( storageDirectory: tmpDir, ); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) .then((value) => runApp(EasyLocalization( path: 'assets/translations', supportedLocales: const <Locale>[ Locale('en'), Locale('fr'), ], fallbackLocale: const Locale('en'), useFallbackTranslations: true, child: const MyApp(), ))); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { final List<String> assets = getImagesAssets(); for (String asset in assets) { precacheImage(AssetImage(asset), context); } return MultiBlocProvider( providers: [ // default providers BlocProvider<NavCubitPage>( create: (context) => NavCubitPage(), ), BlocProvider<NavCubitScreen>( create: (context) => NavCubitScreen(), ), BlocProvider<ApplicationThemeModeCubit>( create: (context) => ApplicationThemeModeCubit(), ), BlocProvider<ActivityCubit>( create: (context) => ActivityCubit(), ), BlocProvider<GlobalSettingsCubit>( create: (context) => GlobalSettingsCubit(), ), BlocProvider<ActivitySettingsCubit>( create: (context) => ActivitySettingsCubit(), ), ], child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( builder: (BuildContext context, ApplicationThemeModeState state) { return MaterialApp( title: ApplicationConfig.appTitle, home: const SkeletonScreen(), // Theme stuff theme: lightTheme, darkTheme: darkTheme, themeMode: state.themeMode, // Localization stuff localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, debugShowCheckedModeBanner: false, ); }, ), ); } List<String> getImagesAssets() { final List<String> assets = []; const List<String> gameImages = [ 'game_fail', 'game_win', 'placeholder', ]; for (String image in gameImages) { assets.add('assets/ui/$image.png'); } final List<String> skinImages = [ 'button_mark_mine_off', 'button_mark_mine_on', 'empty', 'indicator_report_off', 'indicator_report_on', 'indicator_walk_off', 'indicator_walk_on', 'tile_flag_ko', 'tile_flag_ok', 'tile_flag', 'tile_mine_not_found', 'tile_mine', 'tile_unknown', ]; for (int value = 0; value <= 8; value++) { skinImages.add('tile_$value'); } for (String skin in DefaultGlobalSettings.allowedSkinValues) { for (String image in skinImages) { assets.add('assets/skins/${skin}_$image.png'); } } return assets; } }