修复用户端令牌失效后的登录恢复

This commit is contained in:
czl231
2026-09-04 21:54:35 +08:00
parent 7cc56f955f
commit e092659622
19 changed files with 636 additions and 33 deletions

View File

@@ -3,14 +3,22 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../../app/auth_navigation.dart';
import '../../../app/dependencies.dart';
import '../../../data/services/api_client.dart';
/// 用户端手机号密码登录页面。
class LoginPage extends StatefulWidget {
const LoginPage({required this.session, super.key});
const LoginPage({
required this.session,
this.redirectTarget,
this.showSessionExpiredMessage = false,
super.key,
});
final UserSession session;
final String? redirectTarget;
final bool showSessionExpiredMessage;
@override
State<LoginPage> createState() => _LoginPageState();
@@ -27,6 +35,14 @@ class _LoginPageState extends State<LoginPage> {
String? _phoneError;
bool _obscurePassword = true;
@override
void initState() {
super.initState();
if (widget.showSessionExpiredMessage) {
_error = '登录状态已失效,请重新登录';
}
}
@override
void dispose() {
_phone.dispose();
@@ -174,7 +190,13 @@ class _LoginPageState extends State<LoginPage> {
: const Text('安全登录'),
),
TextButton(
onPressed: () => context.push('/register'),
onPressed: () => context.push(
buildAuthLocation(
'/register',
redirectTarget: widget.redirectTarget,
sessionExpired: widget.showSessionExpiredMessage,
),
),
child: const Text('首次使用?注册账号'),
),
const SizedBox(height: 8),

View File

@@ -1,12 +1,24 @@
// 功能描述:提供用户注册流程,并在注册后保留原登录目标页。
// 版本1.1.0
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../../app/auth_navigation.dart';
import '../../../app/dependencies.dart';
import '../../../data/services/api_client.dart';
/// 用户端账号注册页面。
class RegisterPage extends StatefulWidget {
const RegisterPage({required this.session, super.key});
const RegisterPage({
required this.session,
this.redirectTarget,
this.showSessionExpiredMessage = false,
super.key,
});
final UserSession session;
final String? redirectTarget;
final bool showSessionExpiredMessage;
@override
State<RegisterPage> createState() => _RegisterPageState();
@@ -51,7 +63,19 @@ class _RegisterPageState extends State<RegisterPage> {
'request_identity': _requestIdentity,
},
);
if (mounted) Navigator.of(context).pop();
if (mounted) {
if (Navigator.of(context).canPop()) {
Navigator.of(context).pop();
} else {
context.go(
buildAuthLocation(
'/login',
redirectTarget: widget.redirectTarget,
sessionExpired: widget.showSessionExpiredMessage,
),
);
}
}
} catch (error) {
if (mounted) setState(() => _message = error.toString());
} finally {