import 'package:flutter/material.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'core/network/dio_client.dart'; import 'core/storage/local_storage.dart'; import 'core/theme/app_color_scheme.dart'; import 'data/services/user_service.dart'; import 'data/services/market_service.dart'; import 'data/services/trade_service.dart'; import 'data/services/asset_service.dart'; import 'data/services/fund_service.dart'; import 'providers/auth_provider.dart'; import 'providers/market_provider.dart'; import 'providers/asset_provider.dart'; import 'providers/theme_provider.dart'; import 'ui/pages/auth/login_page.dart'; import 'ui/pages/main/main_page.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); Provider.debugCheckInvalidValueType = null; await SharedPreferences.getInstance(); await LocalStorage.init(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: _buildProviders(), child: Consumer( builder: (context, themeProvider, _) { return AuthNavigator( child: ShadApp.custom( themeMode: themeProvider.themeMode, theme: createLightShadTheme(), darkTheme: createDarkShadTheme(), appBuilder: _buildMaterialApp, ), ); }, ), ); } List _buildProviders() { final dioClient = DioClient(); return [ // Theme Provider (必须放在最前面) ChangeNotifierProvider( create: (_) => ThemeProvider()..init(), ), // Services Provider.value(value: dioClient), Provider(create: (_) => UserService(dioClient)), Provider(create: (_) => MarketService(dioClient)), Provider(create: (_) => TradeService(dioClient)), Provider(create: (_) => AssetService(dioClient)), Provider(create: (_) => FundService(dioClient)), // State Management ChangeNotifierProvider( create: (ctx) => AuthProvider(ctx.read()), ), ChangeNotifierProvider( create: (ctx) => MarketProvider(ctx.read()), ), ChangeNotifierProvider( create: (ctx) => AssetProvider( ctx.read(), ctx.read(), ), ), ]; } Widget _buildMaterialApp(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, theme: Theme.of(context), localizationsDelegates: const [ GlobalShadLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], builder: (context, child) => ShadAppBuilder(child: child!), home: _buildHome(), ); } Widget _buildHome() { return Consumer( builder: (context, auth, _) { if (auth.isLoading) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } return auth.isLoggedIn ? const MainPage() : const LoginPage(); }, ); } } /// 认证路由守卫 - 监听认证状态并自动导航 class AuthNavigator extends StatefulWidget { final Widget child; const AuthNavigator({super.key, required this.child}); @override State createState() => _AuthNavigatorState(); } class _AuthNavigatorState extends State { bool? _wasLoggedIn; @override void didChangeDependencies() { super.didChangeDependencies(); final isLoggedIn = context.watch().isLoggedIn; if (_wasLoggedIn == null) { _wasLoggedIn = isLoggedIn; return; } if (_wasLoggedIn != isLoggedIn) { _wasLoggedIn = isLoggedIn; _navigateToAuthPage(isLoggedIn); } } void _navigateToAuthPage(bool isLoggedIn) { WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; // 退出登录时重置其他 Provider 的状态 if (!isLoggedIn) { context.read().resetLoadState(); context.read().resetLoadState(); } Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute( builder: (_) => isLoggedIn ? const MainPage() : const LoginPage(), ), (route) => false, ); }); } @override Widget build(BuildContext context) => widget.child; }