解耦登录中TCP连接的必要,使其能够快速响应登录。3.5秒 降低到 <1秒

This commit is contained in:
2026-05-06 16:09:16 +08:00
parent 9b918a90df
commit ad68952731
3 changed files with 22 additions and 7 deletions

View File

@@ -45,8 +45,8 @@ GoRouter createRouter(AuthCubit authCubit) {
// 注册登录注册 路由
GoRoute(
path: RoutePaths.machineDetails,
builder: (context, state) => const LoginPage(), // 替换为实际页面
path: RoutePaths.login,
builder: (context, state) => const LoginPage(),
),
// 1. 外部路由(无底部导航栏)

View File

@@ -68,12 +68,25 @@ class AuthCubit extends Cubit<AuthState> {
/// 当 HTTP 登录/注册成功后调用
Future<void> loginSuccess(UserEntity user) async {
await storage.saveUser(user);
await tcp.connect(host: TCPConsts.TCP_IP, port: TCPConsts.TCP_PORT);
// await _authTcpDatasource.sendAuthPacket(); //包括发送认证包和获取列表和切换函数
//tcp.startHeartbeat(interval: const Duration(seconds: 4)); //启动心跳
// 🔥 关键修复:先立即更新状态,触发 GoRouter redirect
appCubit.setAuth(user);
emit(AuthAuthenticated(user));
// 然后异步执行其他操作(使用 unawaited 避免阻塞)
_performPostLoginTasks(user);
}
/// 登录后后台任务(不阻塞主流程)
Future<void> _performPostLoginTasks(UserEntity user) async {
try {
await storage.saveUser(user);
await tcp.connect(host: TCPConsts.TCP_IP, port: TCPConsts.TCP_PORT);
// await _authTcpDatasource.sendAuthPacket();
// tcp.startHeartbeat(interval: const Duration(seconds: 4));
} catch (e) {
_logger.logWithLevel('[AUTH] 登录后任务失败: $e', level: 'ERROR');
// 不影响已登录状态,只是记录错误
}
}
/// 退出登录 (主动或被动)

View File

@@ -39,7 +39,9 @@ class _LoginPageState extends State<LoginPage> {
body: BlocListener<LoginCubit, LoginState>(
listener: (context, state) {
if (state is LoginSuccess) {
context.go(RoutePaths.home);
// 登录成功后,AuthCubit 状态已更新
// GoRouter 的 redirect 会自动检测到已登录状态并跳转到首页
// 不需要手动调用 context.go
} else if (state is LoginFailure) {
// 可以在这里弹出简洁的黑白提示框
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('登录失败,${state.message}')));