import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/app_keys.dart'; import '../core/notifications/keep_alive.dart'; import '../core/notifications/local_notifications.dart'; import '../core/theme/app_theme.dart'; import '../core/theme/app_typography.dart'; import '../features/auth/application/session_controller.dart'; import '../features/notice/application/notice_alert_controller.dart'; import 'router.dart'; class VoltLinkApp extends ConsumerStatefulWidget { const VoltLinkApp({super.key}); @override ConsumerState createState() => _VoltLinkAppState(); } class _VoltLinkAppState extends ConsumerState { StreamSubscription? _tapSub; @override void initState() { super.initState(); // 运行期点击系统通知 → 跳转对应页面 _tapSub = LocalNotifications.instance.taps.listen(_openRoute); WidgetsBinding.instance.addPostFrameCallback((_) { // 冷启动由通知拉起时,初始化阶段已把路由暂存下来 final route = LocalNotifications.instance.takeLaunchRoute(); if (route != null) _openRoute(route); // 已登录则开启 Android 前台服务 unawaited( BackgroundKeepAlive.setEnabled(ref.read(sessionProvider).isLoggedIn), ); }); } @override void dispose() { _tapSub?.cancel(); super.dispose(); } void _openRoute(String route) { if (!mounted || route.isEmpty) return; ref.read(routerProvider).go(route); } @override Widget build(BuildContext context) { final router = ref.watch(routerProvider); // 登录/登出时同步 Android 前台服务开关 ref.listen(sessionProvider.select((s) => s.isLoggedIn), (_, loggedIn) { unawaited(BackgroundKeepAlive.setEnabled(loggedIn)); }); // 激活站内消息提醒轮询 ref.watch(noticeAlertProvider); return MaterialApp.router( title: 'VoltLink', debugShowCheckedModeBanner: false, theme: AppTheme.build(), routerConfig: router, scaffoldMessengerKey: AppKeys.scaffoldMessenger, locale: const Locale('zh', 'CN'), supportedLocales: const [Locale('zh', 'CN'), Locale('en', 'US')], localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], // 对应源 `page` 上的全局字体设置。 builder: (context, child) => DefaultTextStyle( style: appDefaultTextStyle, child: child ?? const SizedBox.shrink(), ), ); } }