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_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.isLoggedIn && current.name == 'login') { WidgetsBinding.instance.addPostFrameCallback((_) { final role = authState.user?.role ?? 'User'; if (role == 'Admin') { goRoute(ref, 'adminHome'); } else if (role == 'Doctor') { goRoute(ref, 'doctorHome'); } else { goRoute(ref, 'home'); } }); } return PopScope( canPop: stack.length <= 1, onPopInvokedWithResult: (didPop, result) { if (!didPop) popRoute(ref); }, child: buildPage(current, ref), ); } }