## 核心变更 ### 新增 SessionStorage (lib/core/storage/session_storage.dart) - flutter_secure_storage 封装层 - Android: EncryptedSharedPreferences(AES-256,Android Keystore 托管密钥) - iOS: Keychain(AccessibilityFirstUnlock) - 存储键: genex_access_token / genex_refresh_token / genex_user_json - API: save() / load() / updateTokens() / getRefreshToken() / clear() ### 升级 ApiClient (lib/core/network/api_client.dart) - 新增 Dio 错误拦截器(_buildAuthInterceptor) - 401 自动触发 Token 静默刷新,成功后无感重试原始请求 - Completer 并发锁:多个 401 同时发生只执行一次刷新,其余等待结果 - 跳过重试的端点:/auth/refresh、/auth/login、/auth/register 等 - configureAuthCallbacks():注册 onTokenRefreshed / onSessionExpired 反向回调 ### 升级 AuthService (lib/core/services/auth_service.dart) - _setAuth():登录/注册后 await 写入 SecureStorage - _clearAuth():登出/Token 过期后 await 清除 SecureStorage - restoreSession():App 冷启动时从 SecureStorage 恢复 Token + 注册 ApiClient 回调 - refreshToken():主动刷新(正常由拦截器自动触发,无需手动调用) ### 升级 main.dart - await AuthService.instance.restoreSession() 在 runApp 前执行 - initialRoute 动态判断:isLoggedIn → '/main',否则 '/' - 全局 NavigatorKey(_navigatorKey)挂载到 MaterialApp - 监听 authState ValueNotifier:Token 过期后自动导航回 '/'(pushNamedAndRemoveUntil) ## 用户体验 - 登录后关闭 App 再打开:直接进主界面,无需重新登录 - Access Token 过期:ApiClient 自动静默刷新,用户无感知 - Refresh Token 过期:清除本地会话,跳回欢迎页,提示重新登录 - 主动登出:清除 SecureStorage,跳回欢迎页 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| api_client.dart | ||