From 19acbb2278ea85c3b2a4d23268cc57e10a134b0f Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Thu, 22 Oct 2026 21:49:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=88=91=E7=9A=84=20U?= =?UTF-8?q?ID=20=E8=A1=8C=E9=AB=98=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 1 + lib/core/theme/app_dimens.dart | 4 +- lib/pages/mine/widgets/mine_header.dart | 72 +++++++++++++------------ test/mine/mine_preview_layout_test.dart | 22 ++++++++ 4 files changed, 65 insertions(+), 34 deletions(-) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 25b94cb..4b7e0c4 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -1269,3 +1269,4 @@ $ flutter test - 宫格后新增常见问题与关于我们入口;关于页版本暂用与 pubspec 同步的常量占位。 - 继续观看全部入口可切到追剧页播放历史 tab;`flutter analyze`:No issues found。 - 用户区昵称与 UID 收紧为 4 间距,昵称列相对头像垂直居中;UID 12、复制图标 14。 +- UID 行改用 GestureDetector 并锁定 16 高,昵称与 UID 间距 2、昵称行高 1.15,避免 Material 热区撑高;`flutter analyze`:No issues found。 diff --git a/lib/core/theme/app_dimens.dart b/lib/core/theme/app_dimens.dart index fad5c53..5ab2367 100644 --- a/lib/core/theme/app_dimens.dart +++ b/lib/core/theme/app_dimens.dart @@ -182,8 +182,10 @@ abstract final class AppDimens { static const double mineSectionTitle = 15; static const double mineAvatar = 56; static const double mineUserName = 20; - static const double mineUserNameLineHeight = 1.2; + static const double mineUserNameLineHeight = 1.15; + static const double mineUserNameUidGap = 2; static const double mineUid = 12; + static const double mineUidRowHeight = 16; static const double mineCopyIcon = 14; static const double mineGridHorizontal = 14; static const double mineGridRadius = 12; diff --git a/lib/pages/mine/widgets/mine_header.dart b/lib/pages/mine/widgets/mine_header.dart index b302cfd..a73dde6 100644 --- a/lib/pages/mine/widgets/mine_header.dart +++ b/lib/pages/mine/widgets/mine_header.dart @@ -48,6 +48,7 @@ class MineHeader extends StatelessWidget { children: [ Text( nickname, + key: const Key('mine-nickname'), maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( @@ -58,43 +59,48 @@ class MineHeader extends StatelessWidget { height: AppDimens.mineUserNameLineHeight, ), ), - const SizedBox(height: AppDimens.spaceXs), - Row( - children: [ - Flexible( - child: Text( - '${l10n.accountUid}: ${uid.isEmpty ? '--' : uid}', - key: const Key('mine-uid'), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - color: AppColors.textTertiary, - fontSize: AppDimens.mineUid, + const SizedBox(height: AppDimens.mineUserNameUidGap), + SizedBox( + key: const Key('mine-uid'), + height: AppDimens.mineUidRowHeight, + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Flexible( + child: Text( + '${l10n.accountUid}: ${uid.isEmpty ? '--' : uid}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: AppColors.textTertiary, + fontSize: AppDimens.mineUid, + ), ), ), - ), - const SizedBox(width: AppDimens.spaceXs), - IconButton( - key: const Key('mine-uid-copy'), - tooltip: l10n.copyUid, - onPressed: uid.isEmpty - ? null - : () => unawaited( - _copyUid(context, uid, l10n.uidCopied), + Semantics( + button: true, + label: l10n.copyUid, + child: GestureDetector( + key: const Key('mine-uid-copy'), + behavior: HitTestBehavior.opaque, + onTap: uid.isEmpty + ? null + : () => unawaited( + _copyUid(context, uid, l10n.uidCopied), + ), + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 4), + child: Icon( + Icons.copy_rounded, + color: AppColors.textTertiary, + size: AppDimens.mineCopyIcon, ), - visualDensity: VisualDensity.compact, - constraints: const BoxConstraints.tightFor( - width: AppDimens.mineCopyIcon, - height: AppDimens.mineCopyIcon, + ), + ), ), - padding: EdgeInsets.zero, - icon: const Icon( - Icons.copy_rounded, - color: AppColors.textTertiary, - size: AppDimens.mineCopyIcon, - ), - ), - ], + ], + ), ), ], ), diff --git a/test/mine/mine_preview_layout_test.dart b/test/mine/mine_preview_layout_test.dart index c09efb5..53cebb9 100644 --- a/test/mine/mine_preview_layout_test.dart +++ b/test/mine/mine_preview_layout_test.dart @@ -39,6 +39,28 @@ void main() { expect(find.text('Visitor'), findsOneWidget); expect(find.text('UID: --'), findsOneWidget); expect(find.byKey(const Key('mine-uid-copy')), findsOneWidget); + final uidRowSize = tester.getSize(find.byKey(const Key('mine-uid'))); + expect(uidRowSize.height, closeTo(AppDimens.mineUidRowHeight, 0.1)); + final nicknameRect = tester.getRect(find.byKey(const Key('mine-nickname'))); + final uidRect = tester.getRect(find.byKey(const Key('mine-uid'))); + expect(uidRect.top - nicknameRect.bottom, lessThanOrEqualTo(6)); + final nickname = tester.widget( + find.byKey(const Key('mine-nickname')), + ); + expect(nickname.style?.fontSize, AppDimens.mineUserName); + expect(nickname.style?.fontWeight, FontWeight.w700); + expect(nickname.style?.height, AppDimens.mineUserNameLineHeight); + final uid = tester.widget(find.text('UID: --')); + expect(uid.style?.fontSize, AppDimens.mineUid); + expect(uid.style?.color, AppColors.textTertiary); + final copyIcon = tester.widget( + find.descendant( + of: find.byKey(const Key('mine-uid-copy')), + matching: find.byType(Icon), + ), + ); + expect(copyIcon.size, AppDimens.mineCopyIcon); + expect(copyIcon.color, AppColors.textTertiary); expect(find.byKey(const Key('mine-login')), findsOneWidget); expect(find.byKey(const Key('mine-edit')), findsNothing); expect(find.byKey(const Key('mine-vip')), findsOneWidget);