import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import 'core/app_colors.dart'; import 'core/app_router.dart'; import 'core/app_theme.dart'; import 'core/navigation_provider.dart'; import 'providers/auth_provider.dart'; /// 健康管家 App 根组件 class HealthApp extends ConsumerWidget { const HealthApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { return MaterialApp( title: '健康管家', debugShowCheckedModeBanner: false, theme: AppTheme.lightTheme, localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale('zh', 'CN'), Locale('zh'), ], locale: const Locale('zh'), home: const _RootNavigator(), // 注入 ShadTheme,让所有页面都能用 shadcn 组件 builder: (context, child) => ShadTheme( data: AppTheme.shadTheme, child: child!, ), ); } } /// 根导航——根据 Riverpod 路由状态切换页面 class _RootNavigator extends ConsumerWidget { const _RootNavigator(); @override Widget build(BuildContext context, WidgetRef ref) { final stack = ref.watch(routeStackProvider); final current = stack.last; final authState = ref.watch(authProvider); // 启动时正在检查登录状态 → 显示闪屏 if (authState.isLoading && current.name == 'login') { return Scaffold( backgroundColor: Colors.white, body: Center( child: Column(mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.favorite, size: 48, color: AppColors.primary), const SizedBox(height: 16), Text('健康管家', style: TextStyle(fontSize: 22, fontWeight: FontWeight.w700, color: AppColors.textPrimary)), ]), ), ); } // 登录后根据角色分流 if (authState.isLoggedIn && current.name == 'login') { WidgetsBinding.instance.addPostFrameCallback((_) { goRoute(ref, authState.user?.role == 'Doctor' ? 'doctorHome' : 'home'); }); } return PopScope( canPop: stack.length <= 1, onPopInvokedWithResult: (didPop, result) { if (!didPop) popRoute(ref); }, child: buildPage(current, ref), ); } }