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
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:
@@ -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);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user