Files
xianyan/lib/main.dart
Developer 9ea8d3d606 chore: 汇总批量提交的功能优化与bug修复
本次提交包含多项迭代优化和问题修复:
1. 新增缩略图图片组件、数字格式化工具类,补充多语言翻译类型与本地化支持
2. 优化底部导航栏主题色统一使用动态accent色值
3. 修复多处图表动画、路由跳转、API请求相关问题
4. 简化服务器公告文案,调整默认分屏状态为关闭
5. 新增安卓/iOS桌面快捷方式配置
6. 重构多处状态管理类使用SafeNotifierInit统一异常保护
7. 替换硬编码蓝色为主题色,更新版本号获取方式为动态读取
8. 优化缓存预加载逻辑,移除无用代码
9. 调整默认设置项,优化用户体验细节
2026-05-31 12:24:05 +08:00

252 lines
7.8 KiB
Dart

// ============================================================
// 闲言APP — 应用入口
// 创建时间: 2026-04-20
// 更新时间: 2026-05-30
// 作用: main 函数,初始化存储 + 液态玻璃 + 异常捕获 + 启动 App
// 上次更新: 新增RssService.init()确保RSS Hive存储在启动时初始化
// ============================================================
import 'dart:async';
import 'dart:isolate'
if (dart.library.js) 'core/utils/platform/isolate_stub.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:liquid_glass_widgets/liquid_glass_widgets.dart';
import 'package:flutter/services.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'app/app.dart';
import 'core/constants/app_constants.dart';
import 'core/services/network/deep_link_service.dart';
import 'core/services/performance/performance_orchestrator.dart';
import 'core/services/error/crash_monitor.dart';
import 'core/services/device/haptic_service.dart';
import 'core/storage/kv_storage.dart';
import 'core/services/error/global_error_handler.dart';
import 'core/services/post_agreement_initializer.dart';
import 'core/utils/logger.dart';
import 'core/utils/platform/platform_utils.dart' as pu;
import 'core/registry/page_registry.dart';
import 'core/router/app_router.dart';
import 'core/services/catcher2_config_service.dart';
import 'editor/services/3d/platform_3d_service.dart';
import 'features/template/services/wallpaper_favorite_service.dart';
import 'features/template/services/wallpaper_health_service.dart';
import 'features/mine/settings/services/settings_change_logger.dart';
import 'features/discover/services/rss_service.dart';
import 'features/discover/services/exchange_rate_service.dart';
bool kvStorageReady = false;
bool _liquidGlassReady = false;
bool get liquidGlassReady => _liquidGlassReady;
void main() async {
runZonedGuarded(
() async {
WidgetsFlutterBinding.ensureInitialized();
if (pu.isDesktop) {
doWhenWindowReady(() {
appWindow.minSize = const Size(400, 600);
appWindow.title = '闲言';
appWindow.show();
});
}
if (pu.isOhos) Log.i('🟢 [OHOS] main() 开始执行');
FlutterError.onError = (FlutterErrorDetails details) {
FlutterError.presentError(details);
Log.e(
'🔥 FlutterError.onError',
details.exceptionAsString(),
details.stack,
);
};
GlobalErrorHandler.init();
if (!pu.isWeb) {
Isolate.current.addErrorListener(
RawReceivePort((Object? pair) {
final List<dynamic> errorAndStacktrace = pair as List<dynamic>;
Log.e(
'🔥 Isolate uncaught error',
errorAndStacktrace.first,
StackTrace.fromString(errorAndStacktrace.last.toString()),
);
}).sendPort,
);
}
if (!pu.isWeb) {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
}
if (pu.isOhos) Log.i('🟢 [OHOS] SystemChrome 配置完成');
try {
await AppVersion.init();
Log.i('AppVersion 初始化完成');
} catch (e, st) {
Log.e('AppVersion 初始化失败', e, st);
}
try {
await KvStorage.init();
kvStorageReady = true;
if (pu.isOhos) Log.i('🟢 [OHOS] KvStorage 初始化完成');
} catch (e, st) {
Log.e('KV 存储初始化失败', e, st);
}
try {
await HapticService.init();
Log.i('触觉反馈服务初始化完成');
} catch (e, st) {
Log.e('触觉反馈服务初始化失败', e, st);
}
try {
await WallpaperFavoriteService.init();
Log.i('壁纸收藏服务初始化完成');
} catch (e, st) {
Log.e('壁纸收藏服务初始化失败', e, st);
}
try {
PerformanceOrchestrator.instance.init();
Log.i('PerformanceOrchestrator 初始化完成');
} catch (e, st) {
Log.e('PerformanceOrchestrator 初始化失败', e, st);
}
try {
await LiquidGlassWidgets.initialize();
_liquidGlassReady = true;
Log.i('LiquidGlassWidgets 初始化完成 (ohos=${pu.isOhos})');
} catch (e, st) {
Log.e('LiquidGlassWidgets 初始化失败', e, st);
}
try {
await Platform3DService.instance.detectDeviceCapability();
if (pu.isOhos)
Log.i(
'🟢 [OHOS] 3D设备检测完成 (lowEnd=${Platform3DService.instance.isLowEnd})',
);
} catch (e, st) {
Log.e('3D平台设备检测失败', e, st);
}
try {
_validatePageRegistry();
} catch (e, st) {
Log.e('页面注册表验证失败', e, st);
}
if (!pu.isWeb) {
try {
await DeepLinkService.init();
if (pu.isOhos) Log.i('🟢 [OHOS] 深度链接服务初始化完成');
} catch (e, st) {
Log.e('深度链接服务初始化失败', e, st);
}
}
try {
await CrashMonitor.instance.init();
Log.i('崩溃监控服务初始化完成');
} catch (e, st) {
Log.e('崩溃监控服务初始化失败', e, st);
}
try {
await WallpaperHealthService.init();
Log.i('壁纸源健康检测服务初始化完成');
} catch (e, st) {
Log.e('壁纸源健康检测服务初始化失败', e, st);
}
try {
await SettingsChangeLogger.init();
Log.i('设置变更日志服务初始化完成');
} catch (e, st) {
Log.e('设置变更日志服务初始化失败', e, st);
}
try {
await RssService.init();
Log.i('RSS服务初始化完成');
} catch (e, st) {
Log.e('RSS服务初始化失败', e, st);
}
try {
await ExchangeRateService.init();
Log.i('汇率缓存服务初始化完成');
} catch (e, st) {
Log.e('汇率缓存服务初始化失败', e, st);
}
if (PostAgreementInitializer.shouldInit()) {
Log.i('检测到老用户已完成引导,立即初始化权限敏感服务');
try {
await PostAgreementInitializer.init();
} catch (e, st) {
Log.e('老用户权限敏感服务初始化失败', e, st);
}
} else {
Log.i('新用户未同意协议,权限敏感服务延迟到协议同意后初始化');
}
if (pu.isOhos) {
Log.i('🟢 [OHOS] 所有服务初始化完成,准备 runApp (liquidGlass=$_liquidGlassReady)');
const app = ProviderScope(child: XianyanApp());
if (_liquidGlassReady) {
Catcher2ConfigService.instance.init(
runAppFunction: () {
runApp(LiquidGlassWidgets.wrap(child: app));
},
);
} else {
Catcher2ConfigService.instance.init(
runAppFunction: () {
runApp(app);
},
);
}
Log.i('🟢 [OHOS] runApp() 已调用');
} else {
Catcher2ConfigService.instance.init(
runAppFunction: () {
const app = ProviderScope(child: XianyanApp());
runApp(LiquidGlassWidgets.wrap(child: app));
},
);
}
},
(Object error, StackTrace stack) {
GlobalErrorHandler.handleZoneError(error, stack);
Log.e('🔥 Zone uncaught error', error, stack);
},
);
}
void _validatePageRegistry() {
final errors = PageRegistry.validateAll();
if (errors.isNotEmpty) {
for (final e in errors) {
Log.e('页面注册表验证失败: $e');
}
} else {
Log.i('页面注册表验证通过,共 ${PageRegistry.pageCount} 个页面已注册');
}
const route = AppRoutes.home;
if (!PageRegistry.isRouteRegistered(route)) {
Log.e('页面注册表验证: 首页路由 $route 未注册!');
}
}