Files
DMZJ_F/lib/main.dart
2026-03-07 17:24:59 +08:00

141 lines
5.3 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'dart:ui';
import 'package:fluent_ui/fluent_ui.dart' show FluentLocalizations;
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_dmzj/app/app_style.dart';
import 'package:flutter_dmzj/app/platform_utils.dart';
import 'package:flutter_dmzj/models/db/comic_download_info.dart';
import 'package:flutter_dmzj/models/db/download_status.dart';
import 'package:flutter_dmzj/models/db/local_favorite.dart';
import 'package:flutter_dmzj/models/db/novel_download_info.dart';
import 'package:flutter_dmzj/services/app_settings_service.dart';
import 'package:flutter_dmzj/app/log.dart';
import 'package:flutter_dmzj/app/utils.dart';
import 'package:flutter_dmzj/models/db/comic_history.dart';
import 'package:flutter_dmzj/models/db/novel_history.dart';
import 'package:flutter_dmzj/services/comic_download_service.dart';
import 'package:flutter_dmzj/services/novel_download_service.dart';
import 'package:flutter_dmzj/services/db_service.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:flutter_dmzj/routes/app_pages.dart';
import 'package:flutter_dmzj/services/local_storage_service.dart';
import 'package:flutter_dmzj/services/user_service.dart';
import 'package:flutter_dmzj/widgets/status/app_loadding_widget.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:windows_single_instance/windows_single_instance.dart';
import 'package:dynamic_color/dynamic_color.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
if (!kIsWeb && Platform.isWindows) {
await WindowsSingleInstance.ensureSingleInstance(
[],
"com.xycz.zmhx",
onSecondWindow: (args) {
Log.logPrint(args);
},
);
}
await Hive.initFlutter();
//初始化服务
await initServices();
//设置状态栏为透明
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
SystemUiOverlayStyle systemUiOverlayStyle = const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.dark,
systemNavigationBarColor: Colors.transparent,
);
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
runApp(const DMZJApp());
}
Future initServices() async {
//包信息
Utils.packageInfo = await PackageInfo.fromPlatform();
//本地存储
Log.d("Init LocalStorage Service");
await Get.put(LocalStorageService()).init();
//用户信息
Log.d("Init User Service");
Get.put(UserService()).init();
//注册Hive适配器
Hive.registerAdapter(ComicHistoryAdapter());
Hive.registerAdapter(NovelHistoryAdapter());
Hive.registerAdapter(DownloadStatusAdapter());
Hive.registerAdapter(ComicDownloadInfoAdapter());
Hive.registerAdapter(NovelDownloadInfoAdapter());
Hive.registerAdapter(LocalFavoriteAdapter());
await Get.put(DBService()).init();
//初始化设置服务
Get.put(AppSettingsService());
//初始化漫画下载服务
Get.put(ComicDownloadService()).init();
//初始化小说下载服务
Get.put(NovelDownloadService()).init();
}
class AppScrollBehavior extends MaterialScrollBehavior {
@override
Set<PointerDeviceKind> get dragDevices => PointerDeviceKind.values.toSet();
}
class DMZJApp extends StatelessWidget {
const DMZJApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return DynamicColorBuilder(
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) {
final settings = Get.find<AppSettingsService>();
settings.storeDynamicColorSchemes(lightDynamic, darkDynamic);
final useDynamic = settings.useDynamicColor.value;
return GetMaterialApp(
title: '动漫之家 X',
scrollBehavior: AppScrollBehavior(),
theme: AppStyle.getLightTheme(colorScheme: useDynamic ? lightDynamic : null),
darkTheme: AppStyle.getDarkTheme(colorScheme: useDynamic ? darkDynamic : null),
themeMode:
ThemeMode.values[Get.find<AppSettingsService>().themeMode.value],
initialRoute: AppPages.kIndex,
localizationsDelegates: [
if (PlatformUtils.isWindows) FluentLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
locale: const Locale("zh", "CN"),
supportedLocales: const [Locale("zh", "CN")],
getPages: AppPages.routes,
debugShowCheckedModeBanner: false,
navigatorObservers: [FlutterSmartDialog.observer],
builder: FlutterSmartDialog.init(
loadingBuilder: ((msg) => const AppLoaddingWidget()),
//字体大小不跟随系统变化
builder: (context, child) => Obx(
() => MediaQuery(
data: AppSettingsService.instance.useSystemFontSize.value
? MediaQuery.of(context)
: MediaQuery.of(context)
.copyWith(textScaler: const TextScaler.linear(1.0)),
child: child!,
),
),
),
);
},
);
}
}