feat: 优化前端 UI 与交互体验

This commit is contained in:
qzl
2026-03-16 19:04:54 +08:00
parent 5a34616287
commit d3783522e6
16 changed files with 524 additions and 471 deletions
@@ -7,17 +7,19 @@ class AccountSurfaceScaffold extends StatelessWidget {
const AccountSurfaceScaffold({
super.key,
required this.title,
required this.subtitle,
this.subtitle,
required this.body,
this.footer,
this.onBack,
this.compactHeaderTitle = false,
});
final String title;
final String subtitle;
final String? subtitle;
final Widget body;
final Widget? footer;
final VoidCallback? onBack;
final bool compactHeaderTitle;
@override
Widget build(BuildContext context) {
@@ -27,37 +29,80 @@ class AccountSurfaceScaffold extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
widgets.PageHeader(leading: widgets.BackButton(onPressed: onBack)),
Padding(
padding: const EdgeInsets.fromLTRB(
AppSpacing.xl,
AppSpacing.none,
AppSpacing.xl,
AppSpacing.sm,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 22,
fontWeight: FontWeight.w700,
color: AppColors.slate900,
if (compactHeaderTitle)
SizedBox(
height: 64,
child: Stack(
alignment: Alignment.center,
children: [
widgets.PageHeader(
leading: widgets.BackButton(onPressed: onBack),
trailing: const SizedBox(
width: AppSpacing.xl * 2,
height: AppSpacing.xl * 2,
),
),
IgnorePointer(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: AppSpacing.xxl * 2,
),
child: Text(
title,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.w700,
color: AppColors.slate900,
),
),
),
),
],
),
)
else
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
widgets.PageHeader(
leading: widgets.BackButton(onPressed: onBack),
),
const SizedBox(height: AppSpacing.xs),
Text(
subtitle,
style: const TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500,
color: AppColors.slate500,
Padding(
padding: const EdgeInsets.fromLTRB(
AppSpacing.xl,
AppSpacing.none,
AppSpacing.xl,
AppSpacing.sm,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(
fontSize: 22,
fontWeight: FontWeight.w700,
color: AppColors.slate900,
),
),
if (subtitle != null && subtitle!.isNotEmpty) ...[
const SizedBox(height: AppSpacing.xs),
Text(
subtitle!,
style: const TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500,
color: AppColors.slate500,
),
),
],
],
),
),
],
),
),
Expanded(
child: SingleChildScrollView(
padding: const EdgeInsets.fromLTRB(