refactor(flutter): 重构账号模块并新增配对与独立登录页面
- 将 ApiClient 升级为全局单例,支持完整账号生命周期(登录/注册/刷新/校验/退出) - 新增 TokenResponse / VerifyResponse / BindingItem 数据模型 - 新增 SplashPage 启动登录态检查与 LoginPage 独立登录页 - 新增被控端绑定列表展示、配对码兑换及设备选择功能 - 新增全局 401 拦截器,统一处理令牌失效并跳转登录 - 优化令牌存储策略,对齐 Android 端 TokenStore 行为 - 重构主页面 UI,移除内嵌登录对话框,改用独立页面流程
This commit is contained in:
67
webrtc_controller_flutter/lib/pages/splash_page.dart
Normal file
67
webrtc_controller_flutter/lib/pages/splash_page.dart
Normal file
@@ -0,0 +1,67 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
import '../api/api_client.dart';
|
||||
|
||||
/// 启动页,对应 Android 端 `activity/splash/SplashActivity`。
|
||||
///
|
||||
/// 流程与 Android 端一致:
|
||||
/// 1. 从安全存储恢复本地令牌;
|
||||
/// 2. 无令牌 -> 直接进入登录页;
|
||||
/// 3. 有令牌 -> 调用 `GET /api/client/verify` 校验,失效则用 refreshToken
|
||||
/// 续期后再校验一次(`ApiClient.checkLoginState()`);
|
||||
/// 4. 校验通过进入主页,否则清空令牌并进入登录页。
|
||||
class SplashPage extends StatefulWidget {
|
||||
const SplashPage({super.key, required this.apiClient});
|
||||
|
||||
final ApiClient apiClient;
|
||||
|
||||
@override
|
||||
State<SplashPage> createState() => _SplashPageState();
|
||||
}
|
||||
|
||||
class _SplashPageState extends State<SplashPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_bootstrap();
|
||||
}
|
||||
|
||||
Future<void> _bootstrap() async {
|
||||
await widget.apiClient.restore();
|
||||
final loggedIn = await widget.apiClient.checkLoginState();
|
||||
if (!mounted) return;
|
||||
if (loggedIn) {
|
||||
Navigator.of(context).pushReplacementNamed('/home');
|
||||
} else {
|
||||
// 令牌已失效,清空后要求重新登录。
|
||||
await widget.apiClient.clear();
|
||||
if (!mounted) return;
|
||||
Navigator.of(context).pushReplacementNamed('/login');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const CupertinoPageScaffold(
|
||||
child: Center(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(
|
||||
CupertinoIcons.device_phone_portrait,
|
||||
size: 64,
|
||||
color: CupertinoColors.activeBlue,
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
Text(
|
||||
'WebRTC 控制端',
|
||||
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
|
||||
),
|
||||
SizedBox(height: 24),
|
||||
CupertinoActivityIndicator(),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user