From 8493c4ef3b7ca5a479a4af21e34f2e91942b1572 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Tue, 20 Oct 2026 16:09:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(flutter):=20=E4=BC=98=E5=8C=96=E4=BA=8C?= =?UTF-8?q?=E7=BA=A7=E9=A1=B5=E9=9D=A2=E8=BF=94=E5=9B=9E=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/widgets/subpage_header.dart | 57 ++++++++++++++----- test/core/subpage_header_test.dart | 36 ++++++++++-- test/discover/filter_page_test.dart | 2 +- test/discover/theater_pages_test.dart | 2 +- test/drama_detail/drama_detail_view_test.dart | 15 +++++ test/mine/settings_page_test.dart | 2 +- test/notice/notices_entry_test.dart | 2 +- 7 files changed, 95 insertions(+), 21 deletions(-) diff --git a/lib/core/widgets/subpage_header.dart b/lib/core/widgets/subpage_header.dart index e98130d..ac44985 100644 --- a/lib/core/widgets/subpage_header.dart +++ b/lib/core/widgets/subpage_header.dart @@ -7,14 +7,21 @@ import '../theme/app_colors.dart'; const double _height = 52; const double _heightWithSubtitle = 64; const double _horizontal = 14; -const double _backSize = 36; +const double _backSize = 40; const double _backGap = 12; const double _titleFontSize = 18; const double _subtitleFontSize = 12; const double _actionGap = 8; -const double _iconSize = 20; +const double _iconSize = 22; +const double _iconWeight = 600; +const double _borderWidth = 1; +const double _shadowBlur = 8; +const Color _lightShadowColor = Color(0x14000000); +const Color _darkBackground = Color(0x59000000); +const Color _darkShadowColor = Color(0x33000000); +const Offset _lightShadowOffset = Offset(0, 2); -/// 二级页面统一返回按钮,浅色页使用 card 圆底,深色页使用透明底。 +/// 二级页面统一返回按钮,浅色页使用白底描边,深色页使用半透明黑底。 class AppSubpageBackButton extends StatelessWidget { const AppSubpageBackButton({ super.key, @@ -35,16 +42,40 @@ class AppSubpageBackButton extends StatelessWidget { height: _backSize, child: Tooltip( message: MaterialLocalizations.of(context).backButtonTooltip, - child: Material( - color: dark ? Colors.transparent : AppColors.card, - shape: const CircleBorder(), - clipBehavior: Clip.antiAlias, - child: InkWell( - onTap: onBack ?? () => Navigator.of(context).maybePop(), - child: Icon( - Icons.chevron_left_rounded, - color: dark ? Colors.white : AppColors.onSurface, - size: _iconSize, + child: DecoratedBox( + key: const Key('subpage-back-shadow'), + decoration: BoxDecoration( + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: dark ? _darkShadowColor : _lightShadowColor, + blurRadius: _shadowBlur, + offset: dark ? Offset.zero : _lightShadowOffset, + ), + ], + ), + child: Material( + color: dark ? _darkBackground : AppColors.card, + shape: CircleBorder( + side: dark + ? BorderSide.none + : const BorderSide( + color: AppColors.border, + width: _borderWidth, + ), + ), + clipBehavior: Clip.antiAlias, + child: InkWell( + customBorder: const CircleBorder(), + onTap: onBack ?? () => Navigator.of(context).maybePop(), + child: Center( + child: Icon( + Icons.chevron_left_rounded, + color: dark ? Colors.white : AppColors.onSurface, + size: _iconSize, + weight: _iconWeight, + ), + ), ), ), ), diff --git a/test/core/subpage_header_test.dart b/test/core/subpage_header_test.dart index 7548468..353c4e6 100644 --- a/test/core/subpage_header_test.dart +++ b/test/core/subpage_header_test.dart @@ -23,7 +23,7 @@ void main() { expect(tester.getSize(find.byKey(const Key('subpage-header'))).height, 52); expect( tester.getSize(find.byKey(const Key('sample-back'))), - const Size(36, 36), + const Size(40, 40), ); final title = tester.widget(find.byKey(const Key('subpage-title'))); expect(title.style?.fontSize, 18); @@ -32,6 +32,24 @@ void main() { final back = tester.getRect(find.byKey(const Key('sample-back'))); final titleRect = tester.getRect(find.byKey(const Key('subpage-title'))); expect(titleRect.left - back.right, closeTo(12, 0.5)); + final surface = tester.widget( + find.descendant( + of: find.byKey(const Key('sample-back')), + matching: find.byType(Material), + ), + ); + expect(surface.color, AppColors.card); + expect((surface.shape! as CircleBorder).side.color, AppColors.border); + final shadow = + tester + .widget( + find.byKey(const Key('subpage-back-shadow')), + ) + .decoration + as BoxDecoration; + expect(shadow.boxShadow!.single.color, const Color(0x14000000)); + expect(shadow.boxShadow!.single.blurRadius, 8); + expect(shadow.boxShadow!.single.offset, const Offset(0, 2)); }); testWidgets('should_use_64_height_when_subtitle_exists', (tester) async { @@ -52,7 +70,7 @@ void main() { expect(find.byKey(const Key('subpage-subtitle')), findsOneWidget); }); - testWidgets('should_use_transparent_dark_back_button', (tester) async { + testWidgets('should_use_translucent_dark_back_button', (tester) async { await tester.pumpWidget( MaterialApp( theme: AppTheme.light(), @@ -79,8 +97,18 @@ void main() { matching: find.byIcon(Icons.chevron_left_rounded), ), ); - expect(material.color, Colors.transparent); + expect(material.color, const Color(0x59000000)); expect(icon.color, Colors.white); - expect(icon.size, 20); + expect(icon.size, 22); + expect(icon.weight, 600); + final shadow = + tester + .widget( + find.byKey(const Key('subpage-back-shadow')), + ) + .decoration + as BoxDecoration; + expect(shadow.boxShadow!.single.color, const Color(0x33000000)); + expect(shadow.boxShadow!.single.blurRadius, 8); }); } diff --git a/test/discover/filter_page_test.dart b/test/discover/filter_page_test.dart index 97fd6ed..10fe4c2 100644 --- a/test/discover/filter_page_test.dart +++ b/test/discover/filter_page_test.dart @@ -186,7 +186,7 @@ final List _filterDramas = [ ]; void _expectUnifiedHeader(WidgetTester tester, Key backKey) { - expect(tester.getSize(find.byKey(backKey)), const Size(36, 36)); + expect(tester.getSize(find.byKey(backKey)), const Size(40, 40)); final title = tester.widget(find.byKey(const Key('subpage-title'))); expect(title.style?.fontSize, 18); expect(title.style?.fontWeight, FontWeight.w800); diff --git a/test/discover/theater_pages_test.dart b/test/discover/theater_pages_test.dart index 29442e9..bd12f50 100644 --- a/test/discover/theater_pages_test.dart +++ b/test/discover/theater_pages_test.dart @@ -220,7 +220,7 @@ List _rankDramas(int count) => [ ]; void _expectUnifiedHeader(WidgetTester tester, Key backKey) { - expect(tester.getSize(find.byKey(backKey)), const Size(36, 36)); + expect(tester.getSize(find.byKey(backKey)), const Size(40, 40)); final title = tester.widget(find.byKey(const Key('subpage-title'))); expect(title.style?.fontSize, 18); expect(title.style?.fontWeight, FontWeight.w800); diff --git a/test/drama_detail/drama_detail_view_test.dart b/test/drama_detail/drama_detail_view_test.dart index 370b205..9300e08 100644 --- a/test/drama_detail/drama_detail_view_test.dart +++ b/test/drama_detail/drama_detail_view_test.dart @@ -58,6 +58,21 @@ void main() { tester.getSize(find.byKey(const Key('detail-poster'))), const Size(96, 128), ); + expect( + tester.getSize(find.byKey(const Key('detail-back'))), + const Size(40, 40), + ); + expect( + tester + .widget( + find.descendant( + of: find.byKey(const Key('detail-back')), + matching: find.byType(Material), + ), + ) + .color, + const Color(0x59000000), + ); expect( tester .widget(find.byKey(const Key('detail-title'))) diff --git a/test/mine/settings_page_test.dart b/test/mine/settings_page_test.dart index d748fde..3e1a8f0 100644 --- a/test/mine/settings_page_test.dart +++ b/test/mine/settings_page_test.dart @@ -54,7 +54,7 @@ void main() { expect(find.byKey(const Key('settings-page')), findsOneWidget); expect( tester.getSize(find.byKey(const Key('settings-back'))), - const Size(36, 36), + const Size(40, 40), ); final title = tester.widget(find.byKey(const Key('subpage-title'))); expect(title.style?.fontSize, 18); diff --git a/test/notice/notices_entry_test.dart b/test/notice/notices_entry_test.dart index 140352a..5515a63 100644 --- a/test/notice/notices_entry_test.dart +++ b/test/notice/notices_entry_test.dart @@ -54,7 +54,7 @@ void main() { expect(find.byKey(const Key('notices-page')), findsOneWidget); expect( tester.getSize(find.byKey(const Key('notices-back'))), - const Size(36, 36), + const Size(40, 40), ); final title = tester.widget(find.byKey(const Key('subpage-title'))); expect(title.style?.fontSize, 18);