### 变更详情 1. 新增密保问题系统,支持8种预置验证问题,多场景支持多验证方式 2. 新增勋章管理模块,包含勋章配置、用户勋章关联管理 3. 新增每日任务系统,支持任务配置和用户进度追踪 4. 新增赛季排行榜功能,支持周/月赛季排行与奖励结算 5. 新增信息流推荐权重配置管理 6. 重构服务路径分层,按设备/网络/数据分类管理服务 7. 优化Feed请求参数截断逻辑,避免URL过长 8. 新增等级工具类,统一处理等级颜色与称号展示 9. 新增屏幕共享共享信令Provider,复用传输服务实例 10. 新增Android/iOS分享适配与桌面小组件支持 11. 清理旧版测试脚本,新增部署维护脚本 12. 完善用户注销关联数据清理逻辑
184 lines
5.3 KiB
Dart
184 lines
5.3 KiB
Dart
// ============================================================
|
|
// 闲言APP — 应用入口
|
|
// 创建时间: 2026-04-20
|
|
// 更新时间: 2026-05-14
|
|
// 作用: main 函数,初始化存储 + 液态玻璃 + 异常捕获 + 启动 App
|
|
// 上次更新: 升级 liquid_glass_widgets 至 v0.11.0,适配新 wrap API
|
|
// ============================================================
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:catcher_2/catcher_2.dart';
|
|
import 'package:catcher_2/model/platform_type.dart';
|
|
import 'package:liquid_glass_widgets/liquid_glass_widgets.dart';
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'app/app.dart';
|
|
import 'core/services/network/deep_link_service.dart';
|
|
import 'core/services/notification/local_notification_service.dart';
|
|
import 'core/services/device/screen_wake_service.dart';
|
|
import 'core/services/readlater/sharing_receiver_service.dart';
|
|
import 'core/services/sound_service.dart';
|
|
import 'core/services/device/battery_optimization_service.dart';
|
|
import 'core/services/notification/readlater_reminder_service.dart';
|
|
import 'core/storage/app_kv_store.dart';
|
|
import 'core/storage/kv_storage.dart';
|
|
import 'core/utils/logger.dart';
|
|
import 'core/registry/page_registry.dart';
|
|
import 'core/router/app_router.dart';
|
|
import 'editor/services/3d/platform_3d_service.dart';
|
|
import 'features/inspiration/services/chat_migration_service.dart';
|
|
|
|
bool kvStorageReady = false;
|
|
|
|
void main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
|
SystemChrome.setSystemUIOverlayStyle(
|
|
const SystemUiOverlayStyle(
|
|
statusBarColor: Colors.black,
|
|
statusBarIconBrightness: Brightness.light,
|
|
statusBarBrightness: Brightness.dark,
|
|
systemNavigationBarColor: Colors.black,
|
|
systemNavigationBarIconBrightness: Brightness.light,
|
|
systemNavigationBarDividerColor: Colors.black,
|
|
),
|
|
);
|
|
|
|
try {
|
|
await KvStorage.init();
|
|
kvStorageReady = true;
|
|
Log.i('KV 存储初始化完成');
|
|
} catch (e) {
|
|
Log.e('KV 存储初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
await AppKVStore.init();
|
|
Log.i('AppKVStore (Hive) 初始化完成');
|
|
} catch (e) {
|
|
Log.e('AppKVStore 初始化失败', e);
|
|
}
|
|
|
|
await LiquidGlassWidgets.initialize();
|
|
Log.i('LiquidGlassWidgets 初始化完成');
|
|
|
|
await Platform3DService.instance.detectDeviceCapability();
|
|
Log.i('3D平台设备检测完成 (lowEnd=${Platform3DService.instance.isLowEnd})');
|
|
|
|
_validatePageRegistry();
|
|
|
|
try {
|
|
await DeepLinkService.init();
|
|
Log.i('深度链接服务初始化完成');
|
|
} catch (e) {
|
|
Log.e('深度链接服务初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
SharingReceiverService().init();
|
|
SharingReceiverService().setNavigatorKey(rootNavigatorKey);
|
|
Log.i('分享接收服务初始化完成');
|
|
} catch (e) {
|
|
Log.e('分享接收服务初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
await LocalNotificationService.init();
|
|
Log.i('本地通知服务初始化完成');
|
|
} catch (e) {
|
|
Log.e('本地通知服务初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
await ScreenWakeService.init();
|
|
Log.i('屏幕常亮服务初始化完成');
|
|
} catch (e) {
|
|
Log.e('屏幕常亮服务初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
await SoundService.init();
|
|
Log.i('音效服务初始化完成');
|
|
} catch (e) {
|
|
Log.e('音效服务初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
await BatteryOptimizationService.init();
|
|
Log.i('电池优化服务初始化完成');
|
|
} catch (e) {
|
|
Log.e('电池优化服务初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
await ReadlaterReminderService.startMonitoring();
|
|
Log.i('稍后读提醒服务初始化完成');
|
|
} catch (e) {
|
|
Log.e('稍后读提醒服务初始化失败', e);
|
|
}
|
|
|
|
try {
|
|
await ChatMigrationService.migrateIfNeeded();
|
|
Log.i('聊天数据迁移检查完成');
|
|
} catch (e) {
|
|
Log.e('聊天数据迁移检查失败', e);
|
|
}
|
|
|
|
Catcher2(
|
|
runAppFunction: () {
|
|
runApp(
|
|
LiquidGlassWidgets.wrap(
|
|
child: const ProviderScope(child: XianyanApp()),
|
|
),
|
|
);
|
|
},
|
|
debugConfig: Catcher2Options(
|
|
SilentReportMode(),
|
|
[_RateLimitedHandler()],
|
|
localizationOptions: [LocalizationOptions.buildDefaultChineseOptions()],
|
|
),
|
|
releaseConfig: Catcher2Options(SilentReportMode(), []),
|
|
profileConfig: Catcher2Options(SilentReportMode(), []),
|
|
);
|
|
}
|
|
|
|
class _RateLimitedHandler extends ReportHandler {
|
|
DateTime? _lastLog;
|
|
static const _cooldown = Duration(seconds: 5);
|
|
|
|
@override
|
|
Future<bool> handle(Report report, BuildContext? context) async {
|
|
final now = DateTime.now();
|
|
if (_lastLog == null || now.difference(_lastLog!) > _cooldown) {
|
|
_lastLog = now;
|
|
Log.e('Catcher2: ${report.error}');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@override
|
|
List<PlatformType> getSupportedPlatforms() => PlatformType.values.toList();
|
|
|
|
@override
|
|
bool isContextRequired() => false;
|
|
}
|
|
|
|
/// 页面注册表强制验证
|
|
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 未注册!');
|
|
}
|
|
}
|