chore: 完成多平台兼容性优化与资源更新
本次提交包含多项改进: 1. 新增Android启动页资源与配色配置,完善多版本主题适配 2. 全量替换Platform.pathSeparator为硬编码斜杠,修复Web平台路径兼容问题 3. 为大量文件系统操作添加kIsWeb守卫,优化Web端表现 4. 替换硬编码平台判断为platform_utils封装,统一平台检测逻辑 5. 移除冗余代码与默认参数,优化小部件性能 6. 新增Web端适配逻辑,处理不支持的原生功能 7. 更新鸿蒙兼容性工具,完善平台识别与路径处理 8. 优化设备注册错误捕获,避免非致命崩溃 9. 添加启动页图标与背景配置,优化首屏体验
This commit is contained in:
334
lib/main.dart
334
lib/main.dart
@@ -43,199 +43,193 @@ bool _liquidGlassReady = false;
|
||||
bool get liquidGlassReady => _liquidGlassReady;
|
||||
|
||||
void main() async {
|
||||
runZonedGuarded(
|
||||
() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
// Catcher2 内部会调用 runZonedGuarded 并在其中执行 runApp,
|
||||
// 因此 binding 必须在 Catcher2 之前初始化(在同一个 root zone),
|
||||
// 否则会出现 Zone mismatch 警告。
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
if (pu.isDesktop) {
|
||||
await windowManager.ensureInitialized();
|
||||
const windowOptions = WindowOptions(
|
||||
minimumSize: Size(400, 600),
|
||||
title: '闲言',
|
||||
center: true,
|
||||
);
|
||||
await windowManager.waitUntilReadyToShow(windowOptions, () async {
|
||||
await windowManager.show();
|
||||
});
|
||||
}
|
||||
// 移除外层 runZonedGuarded,由 Catcher2 内部管理 zone
|
||||
// 异常捕获由 Catcher2 + GlobalErrorHandler 共同处理
|
||||
_appMain();
|
||||
}
|
||||
|
||||
if (pu.isOhos) Log.i('🟢 [OHOS] main() 开始执行');
|
||||
/// 应用主入口逻辑
|
||||
Future<void> _appMain() async {
|
||||
if (pu.isDesktop) {
|
||||
await windowManager.ensureInitialized();
|
||||
const windowOptions = WindowOptions(
|
||||
minimumSize: Size(400, 600),
|
||||
title: '闲言',
|
||||
center: true,
|
||||
);
|
||||
await windowManager.waitUntilReadyToShow(windowOptions, () async {
|
||||
await windowManager.show();
|
||||
});
|
||||
}
|
||||
|
||||
FlutterError.onError = (FlutterErrorDetails details) {
|
||||
FlutterError.presentError(details);
|
||||
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(
|
||||
'🔥 FlutterError.onError',
|
||||
details.exceptionAsString(),
|
||||
details.stack,
|
||||
'🔥 Isolate uncaught error',
|
||||
errorAndStacktrace.first,
|
||||
StackTrace.fromString(errorAndStacktrace.last.toString()),
|
||||
);
|
||||
};
|
||||
}).sendPort,
|
||||
);
|
||||
}
|
||||
|
||||
GlobalErrorHandler.init();
|
||||
if (!pu.isWeb) {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
||||
}
|
||||
if (pu.isOhos) Log.i('🟢 [OHOS] SystemChrome 配置完成');
|
||||
|
||||
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,
|
||||
);
|
||||
}
|
||||
try {
|
||||
await AppVersion.init();
|
||||
Log.i('AppVersion 初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('AppVersion 初始化失败', e, st);
|
||||
}
|
||||
|
||||
if (!pu.isWeb) {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
||||
}
|
||||
if (pu.isOhos) Log.i('🟢 [OHOS] SystemChrome 配置完成');
|
||||
try {
|
||||
await KvStorage.init();
|
||||
kvStorageReady = true;
|
||||
if (pu.isOhos) Log.i('🟢 [OHOS] KvStorage 初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('KV 存储初始化失败', e, st);
|
||||
}
|
||||
|
||||
try {
|
||||
await AppVersion.init();
|
||||
Log.i('AppVersion 初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('AppVersion 初始化失败', e, st);
|
||||
}
|
||||
try {
|
||||
await HapticService.init();
|
||||
Log.i('触觉反馈服务初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('触觉反馈服务初始化失败', 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 WallpaperFavoriteService.init();
|
||||
Log.i('壁纸收藏服务初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('壁纸收藏服务初始化失败', e, st);
|
||||
}
|
||||
|
||||
try {
|
||||
await HapticService.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 WallpaperFavoriteService.init();
|
||||
Log.i('壁纸收藏服务初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('壁纸收藏服务初始化失败', e, st);
|
||||
}
|
||||
try {
|
||||
await LiquidGlassWidgets.initialize();
|
||||
_liquidGlassReady = true;
|
||||
Log.i('LiquidGlassWidgets 初始化完成 (ohos=${pu.isOhos})');
|
||||
} catch (e, st) {
|
||||
Log.e('LiquidGlassWidgets 初始化失败', e, st);
|
||||
}
|
||||
|
||||
try {
|
||||
PerformanceOrchestrator.instance.init();
|
||||
Log.i('PerformanceOrchestrator 初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('PerformanceOrchestrator 初始化失败', 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 {
|
||||
await LiquidGlassWidgets.initialize();
|
||||
_liquidGlassReady = true;
|
||||
Log.i('LiquidGlassWidgets 初始化完成 (ohos=${pu.isOhos})');
|
||||
} catch (e, st) {
|
||||
Log.e('LiquidGlassWidgets 初始化失败', e, st);
|
||||
}
|
||||
try {
|
||||
_validatePageRegistry();
|
||||
} catch (e, st) {
|
||||
Log.e('页面注册表验证失败', 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);
|
||||
}
|
||||
if (!pu.isWeb) {
|
||||
try {
|
||||
await DeepLinkService.init();
|
||||
if (pu.isOhos) Log.i('🟢 [OHOS] 深度链接服务初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('深度链接服务初始化失败', e, st);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
_validatePageRegistry();
|
||||
} catch (e, st) {
|
||||
Log.e('页面注册表验证失败', e, st);
|
||||
}
|
||||
try {
|
||||
await CrashMonitor.instance.init();
|
||||
Log.i('崩溃监控服务初始化完成');
|
||||
} 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 WallpaperHealthService.init();
|
||||
Log.i('壁纸源健康检测服务初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('壁纸源健康检测服务初始化失败', e, st);
|
||||
}
|
||||
|
||||
try {
|
||||
await CrashMonitor.instance.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 WallpaperHealthService.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 SettingsChangeLogger.init();
|
||||
Log.i('设置变更日志服务初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('设置变更日志服务初始化失败', e, st);
|
||||
}
|
||||
try {
|
||||
await ExchangeRateService.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);
|
||||
}
|
||||
if (PostAgreementInitializer.shouldInit()) {
|
||||
Log.i('检测到老用户已完成引导,立即初始化权限敏感服务');
|
||||
try {
|
||||
await PostAgreementInitializer.init();
|
||||
} catch (e, st) {
|
||||
Log.e('老用户权限敏感服务初始化失败', e, st);
|
||||
}
|
||||
} else {
|
||||
Log.i('新用户未同意协议,权限敏感服务延迟到协议同意后初始化');
|
||||
}
|
||||
|
||||
try {
|
||||
await ExchangeRateService.init();
|
||||
Log.i('汇率缓存服务初始化完成');
|
||||
} catch (e, st) {
|
||||
Log.e('汇率缓存服务初始化失败', e, st);
|
||||
}
|
||||
// 初始化 Catcher2 异常捕获并启动应用
|
||||
// 使用 rootWidget 方式,Catcher2 内部调用 runApp,避免 Zone mismatch
|
||||
if (_liquidGlassReady) {
|
||||
Catcher2ConfigService.instance.init(
|
||||
rootWidget: LiquidGlassWidgets.wrap(
|
||||
child: const ProviderScope(child: XianyanApp()),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
Catcher2ConfigService.instance.init(
|
||||
rootWidget: const ProviderScope(child: XianyanApp()),
|
||||
);
|
||||
}
|
||||
|
||||
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);
|
||||
},
|
||||
);
|
||||
if (pu.isOhos) {
|
||||
Log.i('🟢 [OHOS] runApp() 已调用');
|
||||
}
|
||||
}
|
||||
|
||||
void _validatePageRegistry() {
|
||||
|
||||
Reference in New Issue
Block a user