From aea130be11dfc939e6817c39f6ac2477e1307ec0 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:05:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(player):=20=E4=BF=AE=E6=AD=A3=E6=B8=85?= =?UTF-8?q?=E5=B1=8F=E6=80=81=E7=82=B9=E5=87=BB=E4=B8=8E=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E5=A4=8D=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/player/player_view.dart | 29 +++++---- test/player/player_fullscreen_test.dart | 78 ++++++++++++++++++------- 2 files changed, 75 insertions(+), 32 deletions(-) diff --git a/lib/pages/player/player_view.dart b/lib/pages/player/player_view.dart index 8d3bb32..93d2f84 100644 --- a/lib/pages/player/player_view.dart +++ b/lib/pages/player/player_view.dart @@ -128,6 +128,9 @@ class _PlayerPageState extends State with WidgetsBindingObserver { itemCount: indices.length, onPageChanged: (position) { final index = indices[position]; + if (widget.homeMode && !_feedChromeVisible) { + setState(() => _feedChromeVisible = true); + } widget.onDramaChanged?.call(logic.queue.entryAt(index).drama); unawaited(logic.selectEpisode(index)); }, @@ -444,17 +447,23 @@ class _PlayerPageState extends State with WidgetsBindingObserver { child: GestureDetector( key: const Key('home-feed-video-tap'), behavior: HitTestBehavior.opaque, - onTap: () => setState(() => _feedChromeVisible = true), + onTap: () => + logic.session.setUserWantsPlay(!logic.session.userWantsPlay), ), ), if (widget.homeMode && !_feedChromeVisible) Positioned( - top: 8, - right: 12, - child: ExitClearScreenButton( - key: const Key('home-feed-exit-clear-screen'), - tooltip: l10n.exitClearScreen, - onPressed: () => setState(() => _feedChromeVisible = true), + top: 0, + right: 0, + child: SafeArea( + left: false, + bottom: false, + minimum: const EdgeInsets.only(top: 8, right: 12), + child: ExitClearScreenButton( + key: const Key('home-feed-exit-clear-screen'), + tooltip: l10n.exitClearScreen, + onPressed: () => setState(() => _feedChromeVisible = true), + ), ), ), ], @@ -635,11 +644,7 @@ class _PlaybackOverlayState extends State<_PlaybackOverlay> { bool _controlsVisible = true; void _onVideoTap() { - if (!_controlsVisible) { - setState(() => _controlsVisible = true); - } else { - widget.onTogglePlay(); - } + widget.onTogglePlay(); } void _clearScreen() => setState(() => _controlsVisible = false); diff --git a/test/player/player_fullscreen_test.dart b/test/player/player_fullscreen_test.dart index 8122046..b946d8a 100644 --- a/test/player/player_fullscreen_test.dart +++ b/test/player/player_fullscreen_test.dart @@ -137,21 +137,22 @@ void main() { const Size(36, 36), ); + await tester.tap(find.byKey(const Key('player-video-tap'))); + await tester.pump(); + expect(find.byKey(const Key('player-controls-top')), findsNothing); + expect(find.byKey(const Key('player-exit-clear-screen')), findsOneWidget); + + await tester.tap(find.byKey(const Key('player-video-tap'))); + await tester.pump(); + expect(find.byKey(const Key('player-controls-top')), findsNothing); + expect(find.byKey(const Key('player-exit-clear-screen')), findsOneWidget); + await tester.tap(find.byKey(const Key('player-exit-clear-screen'))); await tester.pump(); - expect(find.byKey(const Key('player-controls-top')), findsOneWidget); expect(find.byKey(const Key('player-controls-bottom')), findsOneWidget); expect(find.byType(PlayerCenterToggle), findsOneWidget); expect(find.byKey(const Key('player-exit-clear-screen')), findsNothing); - - await tester.tap(find.byKey(const Key('player-clear-screen'))); - await tester.pump(); - expect(find.byKey(const Key('player-exit-clear-screen')), findsOneWidget); - await tester.tap(find.byKey(const Key('player-video-tap'))); - await tester.pump(); - expect(find.byKey(const Key('player-controls-top')), findsOneWidget); - expect(find.byKey(const Key('player-exit-clear-screen')), findsNothing); }); testWidgets('should_fit_player_header_on_320_width', (tester) async { @@ -196,6 +197,35 @@ void main() { tester.getSize(find.byKey(const Key('home-feed-exit-clear-screen'))), const Size(36, 36), ); + expect( + find.ancestor( + of: find.byKey(const Key('home-feed-exit-clear-screen')), + matching: find.byType(SafeArea), + ), + findsWidgets, + ); + expect( + tester + .getTopLeft(find.byKey(const Key('home-feed-exit-clear-screen'))) + .dy, + greaterThanOrEqualTo(8), + ); + + await tester.tap(find.byKey(const Key('home-feed-video-tap'))); + await tester.pump(); + expect(find.byKey(const Key('home-feed-title')), findsNothing); + expect( + find.byKey(const Key('home-feed-exit-clear-screen')), + findsOneWidget, + ); + + await tester.tap(find.byKey(const Key('home-feed-video-tap'))); + await tester.pump(); + expect(find.byKey(const Key('home-feed-title')), findsNothing); + expect( + find.byKey(const Key('home-feed-exit-clear-screen')), + findsOneWidget, + ); await tester.tap(find.byKey(const Key('home-feed-exit-clear-screen'))); await tester.pump(); @@ -204,17 +234,7 @@ void main() { expect(find.byKey(const Key('home-feed-info-card')), findsOneWidget); expect(find.byKey(const Key('home-feed-scrim')), findsOneWidget); expect(find.byKey(const Key('home-feed-exit-clear-screen')), findsNothing); - - await tester.tap(find.byKey(const Key('home-feed-clear-screen'))); - await tester.pump(); - expect( - find.byKey(const Key('home-feed-exit-clear-screen')), - findsOneWidget, - ); - await tester.tap(find.byKey(const Key('home-feed-video-tap'))); - await tester.pump(); - expect(find.byKey(const Key('home-feed-title')), findsOneWidget); - expect(find.byKey(const Key('home-feed-exit-clear-screen')), findsNothing); + expect(find.byKey(const Key('home-feed-center-play')), findsNothing); }); testWidgets('should_show_home_play_toggle_only_when_paused', (tester) async { @@ -231,6 +251,24 @@ void main() { await tester.pump(); expect(find.byKey(const Key('home-feed-center-play')), findsNothing); }); + + testWidgets('should_reset_home_chrome_when_swiping_to_next_page', ( + tester, + ) async { + await _pumpApp(tester); + await tester.tap(find.byKey(const Key('tab-home'))); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('home-feed-clear-screen'))); + await tester.pump(); + expect(find.byKey(const Key('home-feed-title')), findsNothing); + + await tester.drag(find.byType(PageView), const Offset(0, -550)); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key('home-feed-title')), findsOneWidget); + expect(find.byKey(const Key('home-feed-info-card')), findsOneWidget); + expect(find.byKey(const Key('home-feed-exit-clear-screen')), findsNothing); + }); } void _expectFullscreenOverlay(WidgetTester tester) {