From a6143f2ba7cb36b3d9edaa5e66fff523315ae46c Mon Sep 17 00:00:00 2001 From: Songzex <2402265378@qq.com> Date: Wed, 17 Jun 2026 13:47:24 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=97=E6=BC=8F=E6=96=87=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/presentation/bloc/auth_cubit.dart | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/features/auth/presentation/bloc/auth_cubit.dart b/lib/features/auth/presentation/bloc/auth_cubit.dart index a14803a6..5a14f19d 100644 --- a/lib/features/auth/presentation/bloc/auth_cubit.dart +++ b/lib/features/auth/presentation/bloc/auth_cubit.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get_it/get_it.dart'; import 'package:maibu_satabot_v2/core/consts/tcp_consts.dart'; @@ -23,6 +24,7 @@ import '../../../../features/v2/site/presentation/cubit/site_cubit.dart'; import '../../data/datasources/auth_tcp_datasource.dart'; import '../../data/datasources/impl/auth_tcp_datasource_impl.dart'; import 'auth_state.dart'; +import '../../../../main.dart'; // 🔥 导入 main.dart 以使用 navigatorKey /// emit做的事情: /// 1.修改状态标志:通过改变类的类型(从 Initial 变成 Authenticated) @@ -101,11 +103,50 @@ class AuthCubit extends Cubit { _clearAllBusinessState(); await storage.deleteUser(); - tcp.disconnect(); // 断开后会自动重连 + tcp.forceDisconnect(); // 🔥 修复:彻底断开连接,禁止自动重连 appCubit.clearAuth(); emit(AuthUnauthenticated()); } + /// 🔥 新增:显示异地登录提示弹窗 + void _showKickOutDialog() { + try { + debugPrint('>>> [AUTH] 📢 准备显示异地登录提示弹窗'); + _logger.logWithLevel('>>> [AUTH] 📢 准备显示异地登录提示弹窗', shouldLog: true); + + // 使用全局 navigatorKey 显示弹窗 + final context = navigatorKey.currentContext; + if (context != null) { + showDialog( + context: context, + barrierDismissible: false, // 不允许点击背景关闭 + builder: (BuildContext dialogContext) { + return AlertDialog( + title: const Text('账号被顶下线'), + content: const Text('您的账号在其他设备登录,即将退出当前设备...'), + actions: [], + ); + }, + ); + } else { + debugPrint('>>> [AUTH] ⚠️ 无法获取 Navigator Context,将直接退出'); + _logger.logWithLevel('>>> [AUTH] ⚠️ 无法获取 Navigator Context,将直接退出', shouldLog: true); + } + + // 🔥 延迟 2 秒后执行退出,给用户时间看到提示 + Future.delayed(const Duration(seconds: 2), () { + debugPrint('>>> [AUTH] ⏰ 延迟结束,开始执行退出登录'); + _logger.logWithLevel('>>> [AUTH] ⏰ 延迟结束,开始执行退出登录', shouldLog: true); + logout(); + }); + } catch (e) { + debugPrint('>>> [AUTH] ❌ 显示弹窗失败:$e'); + _logger.logWithLevel('>>> [AUTH] ❌ 显示弹窗失败:$e', level: 'ERROR'); + // 即使显示弹窗失败,也要执行退出 + logout(); + } + } + /// 🔥 新增:清空所有业务状态,防止数据泄露到新账户 void _clearAllBusinessState() { try { @@ -178,7 +219,8 @@ class AuthCubit extends Cubit { '⚠️ [AUTH] 检测到异地登录 (respond=have_logged_in),开始退出...', level: 'INFO', ); - logout(); + // 🔥 修复:先显示友好提示,再执行退出 + _showKickOutDialog(); } else { debugPrint('>>> [AUTH] ℹ️ 收到 0x12 消息,respond="$respond",不处理'); }