first commit

This commit is contained in:
2025-03-03 20:59:42 +03:00
commit 273e68557a
1099 changed files with 17880 additions and 0 deletions

183
lib/app.dart Normal file
View File

@@ -0,0 +1,183 @@
import 'dart:async';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fps_widget/fps_widget.dart';
import 'package:provider/provider.dart';
import 'package:remever/common/events/common_events.dart';
import 'package:remever/common/events/events.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/common/getters.dart';
import 'package:remever/common/mixin/subscriptionable.dart';
import 'package:remever/common/storage.dart';
import 'package:remever/components/notifiers/app_settings.dart';
import 'package:remever/components/listeners/theme_listener.dart';
import 'package:remever/i18n/strings.g.dart';
import 'package:remever/inject.dart';
import 'package:remever/router.dart';
import 'package:remever/theme/custom_theme.dart';
final Completer<GlobalKey<NavigatorState>> navKeyCompleter =
Completer<GlobalKey<NavigatorState>>();
class MyApp extends StatefulWidget {
///
/// Основной класс приложения
///
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
///
/// Состояние приложения
///
class _MyAppState extends State<MyApp>
with Subscriptionable<MyApp>, WidgetsBindingObserver {
///
/// Установка максимально фреймрейта
///
Future<void> setOptimalDisplayMode() async {
if (Platform.isAndroid) {
try {
await FlutterDisplayMode.setHighRefreshRate();
} on PlatformException catch (e) {
debugPrint('Не удалось установить частоту кадров экрана ${e.code}');
}
}
}
@override
void initState() {
unawaited(setOptimalDisplayMode());
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
List<StreamSubscription<dynamic>> get subscribe {
return <StreamSubscription<dynamic>>[
/// Слушатель событий оповещений
eventBus.on<NotificationEvent>().listen((NotificationEvent event) {
log('app -> ${event.text}');
}),
];
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
break;
case AppLifecycleState.inactive:
case AppLifecycleState.paused:
case AppLifecycleState.detached:
case AppLifecycleState.hidden:
///
/// При сворачивании/закрывании приложения
/// Компонуем все [Hive] хранилища
///
hiveLang.compact();
hiveTheme.compact();
break;
}
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations(<DeviceOrientation>[
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
return Builder(
builder: (BuildContext context) {
return ScreenUtilInit(
designSize: const Size(380, 812),
minTextAdapt: true,
splitScreenMode: true,
useInheritedMediaQuery: true,
builder: (_, __) => _buildListeners(),
);
},
);
}
///
/// Построение слушателей
///
Widget _buildListeners() {
return ThemeModeListener(
builder: (BuildContext context, ThemeMode themeMode) {
return _buildMaterialApp(themeMode);
},
);
}
///
/// Основной построитель приложения
///
Widget _buildMaterialApp(ThemeMode themeMode) {
return MaterialApp.router(
title: 'Who Will Win',
theme: CustomTheme.lightTheme,
darkTheme: CustomTheme.darkTheme,
themeMode: themeMode,
showPerformanceOverlay: false,
locale: TranslationProvider.of(context).flutterLocale,
supportedLocales: AppLocaleUtils.supportedLocales,
localizationsDelegates: GlobalMaterialLocalizations.delegates,
routerConfig: globalRouter.config(),
builder: (BuildContext context, Widget? child) {
return ChangeNotifierProvider<AppSettingsNotifier>(
create: (_) => settingsNotifier,
builder: (BuildContext context, Widget? nchild) {
if (nchild != null) return nchild;
return Consumer<AppSettingsNotifier>(
// TIP: должно убрать мерцание
key: const Key('consumer AppSettingsNotifier'),
child: child,
builder: (
BuildContext context,
AppSettingsNotifier value,
Widget? nchild,
) {
final Widget result = nchild ?? const SizedBox();
if (value.showFps) {
return Material(
child: FPSWidget(
alignment: Alignment.centerLeft,
child: result,
),
);
}
return result;
},
);
},
);
},
);
}
}