chore: release client-v1.0.62
Deploy Client / build-client-web (push) Successful in 40s
Deploy Client / build-macos (push) Successful in 2m0s
Deploy Client / build-android (push) Successful in 1m9s
Deploy Client / build-ios (push) Successful in 2m30s
Deploy Client / build-windows (push) Successful in 2m16s
Deploy Client / release-deploy-client (push) Successful in 1m23s

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-20 10:14:44 +08:00
parent 15ef71734d
commit 648d9bc0d5
4 changed files with 75 additions and 55 deletions
+31 -5
View File
@@ -94,6 +94,34 @@ class _LoginScreenState extends ConsumerState<LoginScreen> {
Timer(AppConstants.dropdownCloseDelay, _closeUsername);
}
});
// 处理「进入登录页之前」就已置入的会话失效提示:登出在 login_screen 挂载前就
// 设好了 sessionEndedMessageProvider,而 build 里的 ref.listen 只捕获注册之后的
// 变化,会漏掉这个既有值 → 之前「被顶下线无提示」的根因。这里在首帧主动读一次。
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
final msg = ref.read(sessionEndedMessageProvider);
if (msg != null && msg.isNotEmpty) _showSessionEndedDialog(msg);
});
}
/// 弹出「登录已失效 / 被强制下线」提示弹窗,并清空 provider 避免重复弹。
void _showSessionEndedDialog(String msg) {
if (!mounted) return;
ref.read(sessionEndedMessageProvider.notifier).state = null;
showDialog<void>(
context: context,
builder: (ctx) => AlertDialog(
icon: const Icon(Icons.lock_outline, color: AppTheme.danger),
title: const Text('登录已失效'),
content: Text(msg),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(),
child: const Text('我知道了'),
),
],
),
);
}
Future<void> _loadHistory() async {
@@ -346,14 +374,12 @@ class _LoginScreenState extends ConsumerState<LoginScreen> {
@override
Widget build(BuildContext context) {
// 被踢下线 / 会话失效:登出后跳回登录页,弹一次提示并清空
// 已在登录页时会话失效(例如停留在登录页期间后台请求被吊销):弹窗提示。
// 进入登录页之前就置入的既有值由 initState 的首帧读取处理。
ref.listen<String?>(sessionEndedMessageProvider, (prev, next) {
if (next != null && next.isNotEmpty) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(next), backgroundColor: AppTheme.danger));
ref.read(sessionEndedMessageProvider.notifier).state = null;
_showSessionEndedDialog(next);
});
}
});