feat: 设置页面增强,支持用户信息展示和密码修改

This commit is contained in:
qzl
2026-03-10 17:43:17 +08:00
parent 8dd48ec15b
commit f30bfc2006
9 changed files with 859 additions and 135 deletions
@@ -5,6 +5,7 @@ import '../../../../core/theme/design_tokens.dart';
import '../../../../shared/widgets/page_header.dart' as widgets;
import '../../../auth/presentation/bloc/auth_bloc.dart';
import '../../../auth/presentation/bloc/auth_event.dart';
import '../../../auth/presentation/bloc/auth_state.dart';
class AccountScreen extends StatelessWidget {
const AccountScreen({super.key});
@@ -22,8 +23,6 @@ class AccountScreen extends StatelessWidget {
padding: const EdgeInsets.all(20),
child: Column(
children: [
_buildAccountInfo(),
const SizedBox(height: 16),
_buildMenuCard(context),
const SizedBox(height: 24),
_buildLogoutButton(context),
@@ -60,51 +59,6 @@ class AccountScreen extends StatelessWidget {
);
}
Widget _buildAccountInfo() {
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: AppColors.borderSecondary),
),
child: Row(
children: [
Container(
width: 56,
height: 56,
decoration: BoxDecoration(
color: AppColors.surfaceInfo,
borderRadius: BorderRadius.circular(28),
),
child: const Icon(Icons.person, size: 28, color: AppColors.blue500),
),
const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Qiuzhiliang',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w600,
color: AppColors.slate900,
),
),
const SizedBox(height: 4),
const Text(
'qiuzhiliang@xunmee.com',
style: TextStyle(fontSize: 14, color: AppColors.slate500),
),
],
),
),
],
),
);
}
Widget _buildMenuCard(BuildContext context) {
return Container(
decoration: BoxDecoration(
@@ -114,14 +68,16 @@ class AccountScreen extends StatelessWidget {
),
child: Column(
children: [
_buildMenuItem(icon: Icons.edit, title: '编辑资料', onTap: () {}),
_buildDivider(),
_buildMenuItem(icon: Icons.lock, title: '修改密码', onTap: () {}),
_buildMenuItem(
icon: Icons.edit,
title: '编辑资料',
onTap: () => context.push('/edit-profile'),
),
_buildDivider(),
_buildMenuItem(
icon: Icons.swap_horiz,
title: '切换账户',
onTap: () => _showSwitchAccountDialog(context),
icon: Icons.lock,
title: '修改密码',
onTap: () => context.push('/change-password'),
),
],
),
@@ -212,10 +168,16 @@ class AccountScreen extends StatelessWidget {
child: const Text('取消'),
),
TextButton(
onPressed: () {
onPressed: () async {
Navigator.of(dialogContext).pop();
context.read<AuthBloc>().add(AuthLoggedOut());
context.go('/');
final authBloc = context.read<AuthBloc>();
authBloc.add(AuthLoggedOut());
await authBloc.stream.firstWhere(
(state) => state is AuthUnauthenticated,
);
if (context.mounted) {
context.go('/');
}
},
child: const Text('退出', style: TextStyle(color: Color(0xFFDC2626))),
),
@@ -223,27 +185,4 @@ class AccountScreen extends StatelessWidget {
),
);
}
void _showSwitchAccountDialog(BuildContext context) {
showDialog(
context: context,
builder: (dialogContext) => AlertDialog(
title: const Text('切换账户'),
content: const Text('确定要切换到其他账户吗?'),
actions: [
TextButton(
onPressed: () => Navigator.of(dialogContext).pop(),
child: const Text('取消'),
),
TextButton(
onPressed: () {
Navigator.of(dialogContext).pop();
context.go('/');
},
child: const Text('确定'),
),
],
),
);
}
}