import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:go_router/go_router.dart'; import 'core/di/injection_container.dart'; import 'core/theme/app_theme.dart'; import 'core/services/auth_event_service.dart'; import 'core/services/multi_account_service.dart'; import 'routes/app_router.dart'; import 'routes/route_paths.dart'; class App extends ConsumerStatefulWidget { const App({super.key}); @override ConsumerState createState() => _AppState(); } class _AppState extends ConsumerState { StreamSubscription? _authEventSubscription; @override void initState() { super.initState(); _listenToAuthEvents(); } @override void dispose() { _authEventSubscription?.cancel(); super.dispose(); } /// 监听认证事件 void _listenToAuthEvents() { final authEventService = ref.read(authEventServiceProvider); _authEventSubscription = authEventService.events.listen((event) { if (event.type == AuthEventType.tokenExpired) { _handleTokenExpired(event.message); } }); } /// 处理 token 过期 Future _handleTokenExpired(String? message) async { debugPrint('[App] Token expired, navigating to login page'); // 清除当前账号状态(但保留账号列表和向导页标识) final secureStorage = ref.read(secureStorageProvider); final multiAccountService = MultiAccountService(secureStorage); await multiAccountService.logoutCurrentAccount(); // 使用全局 Navigator Key 跳转到登录页面 final navigatorState = rootNavigatorKey.currentState; if (navigatorState != null) { // 显示提示消息 if (message != null) { ScaffoldMessenger.of(navigatorState.context).showSnackBar( SnackBar( content: Text(message), backgroundColor: Colors.orange, ), ); } // 跳转到登录页面 navigatorState.context.go(RoutePaths.phoneLogin); } } @override Widget build(BuildContext context) { final router = ref.watch(appRouterProvider); return ScreenUtilInit( designSize: const Size(360, 800), // 与 UIPro Figma 设计稿一致 minTextAdapt: true, splitScreenMode: true, useInheritedMediaQuery: true, builder: (context, child) { return MaterialApp.router( title: '榴莲皇后', debugShowCheckedModeBanner: false, theme: AppTheme.light, routerConfig: router, builder: (context, widget) { // 限制系统字体缩放,保持 UI 一致性 return MediaQuery( data: MediaQuery.of(context).copyWith( textScaler: TextScaler.noScaling, ), child: widget!, ); }, ); }, ); } }