import 'package:flutter/material.dart'; import 'package:patbond_flutter/core/network/api_client.dart'; import 'package:patbond_flutter/core/network/token_refresher.dart'; import 'package:patbond_flutter/core/theme/app_theme.dart'; import 'package:patbond_flutter/features/auth/auth_repository.dart'; import 'package:patbond_flutter/features/auth/login_page.dart'; import 'package:patbond_flutter/features/auth/session_manager.dart'; import 'package:patbond_flutter/features/auth/splash_page.dart'; import 'package:patbond_flutter/features/main/main_shell_page.dart'; import 'package:patbond_flutter/state/app_state.dart'; class App extends StatefulWidget { const App({super.key, this.sessionManager, this.authRepository}); /// 测试注入口;生产默认走安全存储 + 真实 API。 final SessionManager? sessionManager; final AuthRepository? authRepository; @override State createState() => _AppState(); } class _AppState extends State { late final AppState appState; late final SessionManager sessionManager; late final AuthRepository authRepository; @override void initState() { super.initState(); appState = AppState()..load(); sessionManager = widget.sessionManager ?? SessionManager(store: const SecureTokenStore()); authRepository = widget.authRepository ?? _buildRepository(); } AuthRepository _buildRepository() { final dio = buildPatbondDio(session: sessionManager); final refresher = TokenRefresher(dio: dio, session: sessionManager); final api = ApiClient( dio: dio, session: sessionManager, refresher: refresher, ); return ApiAuthRepository( api: api, session: sessionManager, refresher: refresher, ); } @override void dispose() { appState.dispose(); if (widget.sessionManager == null) sessionManager.dispose(); super.dispose(); } Widget _homeForStatus() { switch (sessionManager.status) { case AuthStatus.unknown: return SplashPage( key: const ValueKey('splash'), authRepository: authRepository, sessionManager: sessionManager, ); case AuthStatus.unauthenticated: return LoginPage( key: const ValueKey('login'), authRepository: authRepository, ); case AuthStatus.authenticated: return MainShellPage( key: const ValueKey('shell'), appState: appState, onLogout: authRepository.logout, ); } } @override Widget build(BuildContext context) { return MaterialApp( title: 'Patbond', debugShowCheckedModeBanner: false, theme: buildAppTheme(), home: ListenableBuilder( listenable: sessionManager, builder: (context, _) { // 认证状态切换统一 300ms 淡入淡出(Splash ↔ 登录 ↔ 主壳, // BrandMark 同构保证品牌区过渡对位,组装稿 §7)。 return AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: _homeForStatus(), ); }, ), ); } }