import 'package:flutter/material.dart'; import 'package:qhd_prevention/pages/badge_manager.dart'; import 'package:qhd_prevention/tools/auth_service.dart'; import 'package:shared_preferences/shared_preferences.dart'; import './pages/login_page.dart'; import './pages/main_tab.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'http/HttpManager.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; // 全局导航键 final GlobalKey navigatorKey = GlobalKey(); // 全局消息控制器 class GlobalMessage { static void showError(String message) { final context = navigatorKey.currentContext; if (context != null) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(message), backgroundColor: Colors.red, duration: const Duration(seconds: 3), ), ); } } } void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化 EasyLoading EasyLoading.instance ..displayDuration = const Duration(seconds: 20) ..indicatorType = EasyLoadingIndicatorType.ring ..loadingStyle = EasyLoadingStyle.custom ..indicatorSize = 36.0 ..radius = 0 ..progressColor = Colors.blue ..backgroundColor = Colors.grey.shade300 ..indicatorColor = Colors.blue ..textColor = Colors.black ..userInteractions = false ..dismissOnTap = false; await initializeDateFormatting('zh_CN', null); // 初始化HTTP管理器未授权回调 HttpManager.onUnauthorized = () async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool('isLoggedIn', false); await prefs.remove('token'); navigatorKey.currentState?.pushNamedAndRemoveUntil( '/login', (route) => false, ); Future.delayed(const Duration(milliseconds: 100), () { GlobalMessage.showError('会话已过期,请重新登录'); }); }; // 自动登录逻辑 final prefs = await SharedPreferences.getInstance(); final savedLogin = prefs.getBool('isLoggedIn') ?? false; bool isLoggedIn = false; if (savedLogin) { // 如果本地标记已登录,进一步验证 token 是否有效 try { isLoggedIn = await AuthService.isLoggedIn(); // 这里建议 AuthService.isLoggedIn() 内部实际请求一次用户信息接口 // 如果失败,就返回 false } catch (e) { isLoggedIn = false; } } runApp(MyApp(isLoggedIn: isLoggedIn)); } class MyApp extends StatelessWidget { final bool isLoggedIn; const MyApp({super.key, required this.isLoggedIn}); @override Widget build(BuildContext context) { return MaterialApp( title: '', navigatorKey: navigatorKey, builder: (context, child) { return EasyLoading.init( builder: (context, widget) { return GestureDetector( behavior: HitTestBehavior.translucent, onTap: () { FocusScope.of(context).unfocus(); }, child: widget, ); }, )(context, child); }, theme: ThemeData( dividerTheme: const DividerThemeData( color: Colors.black12, thickness: .5, indent: 0, endIndent: 0, ), primarySwatch: Colors.blue, scaffoldBackgroundColor: const Color(0xFFF1F1F1), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), inputDecorationTheme: const InputDecorationTheme( border: InputBorder.none, contentPadding: EdgeInsets.symmetric(horizontal: 8), ), snackBarTheme: const SnackBarThemeData( behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(8)), ), ), progressIndicatorTheme: const ProgressIndicatorThemeData( color: Colors.blue, ), ), home: isLoggedIn ? const MainPage() : const LoginPage(), debugShowCheckedModeBanner: false, routes: { '/login': (_) => const LoginPage(), }, ); } }