Files
VibeCoding/webrtc_controller_flutter/lib/pages/splash_page.dart
TongTongStudio bb488d216d refactor(flutter): 重构账号模块并新增配对与独立登录页面
- 将 ApiClient 升级为全局单例,支持完整账号生命周期(登录/注册/刷新/校验/退出)
- 新增 TokenResponse / VerifyResponse / BindingItem 数据模型
- 新增 SplashPage 启动登录态检查与 LoginPage 独立登录页
- 新增被控端绑定列表展示、配对码兑换及设备选择功能
- 新增全局 401 拦截器,统一处理令牌失效并跳转登录
- 优化令牌存储策略,对齐 Android 端 TokenStore 行为
- 重构主页面 UI,移除内嵌登录对话框,改用独立页面流程
2026-08-03 16:20:11 +08:00

68 lines
1.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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(),
],
),
),
);
}
}