From f0c53542ef32f173d50f42911af443bb9d8fa946 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:07:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(player):=20=E7=A7=BB=E9=99=A4=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=9A=82=E5=81=9C=E9=87=8D=E5=A4=8D=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/player/player_view.dart | 19 ++++++++- test/player/player_fullscreen_test.dart | 55 +++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/lib/pages/player/player_view.dart b/lib/pages/player/player_view.dart index 997cfe6..0641b60 100644 --- a/lib/pages/player/player_view.dart +++ b/lib/pages/player/player_view.dart @@ -29,6 +29,16 @@ import 'widgets/seek_progress_bar.dart'; import '../../core/data/repositories/watch_history_repository.dart'; import '../../core/data/repositories/playback_repository.dart'; +/// The home feed has no overlay play button, so it keeps its own center hint. +/// Detail/series playback uses `_PlaybackOverlay.player-play-toggle` instead. +bool shouldShowFeedPauseIndicator({ + required bool homeMode, + required bool selected, + required bool ready, + required bool playing, + required bool pip, +}) => homeMode && selected && ready && !playing && !pip; + class PlayerPage extends StatefulWidget { const PlayerPage({ super.key, @@ -301,8 +311,15 @@ class _PlayerPageState extends State with WidgetsBindingObserver { ), ), ), - if (selected && ready && !logic.session.userWantsPlay && !logic.pip) + if (shouldShowFeedPauseIndicator( + homeMode: widget.homeMode, + selected: selected, + ready: ready, + playing: logic.session.userWantsPlay, + pip: logic.pip, + )) const Center( + key: Key('home-feed-center-play'), child: IgnorePointer( child: DecoratedBox( decoration: BoxDecoration( diff --git a/test/player/player_fullscreen_test.dart b/test/player/player_fullscreen_test.dart index 1cd1142..22acdaa 100644 --- a/test/player/player_fullscreen_test.dart +++ b/test/player/player_fullscreen_test.dart @@ -9,6 +9,7 @@ import 'package:fruitshorts/app.dart'; import 'package:fruitshorts/core/data/repositories/favorite_repository.dart'; import 'package:fruitshorts/core/data/repositories/playback_repository.dart'; import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart'; +import 'package:fruitshorts/pages/player/player_view.dart'; import '../support/fake_catalog.dart'; import '../support/fake_category.dart'; @@ -67,6 +68,60 @@ void main() { ); expect(tester.takeException(), isNull); }); + + testWidgets('should_keep_single_pause_toggle_when_detail_player_is_paused', ( + tester, + ) async { + await _pumpApp(tester); + await tester.binding.handlePopRoute(); + await tester.pumpAndSettle(); + await tester.binding.handlePopRoute(); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('drawer-open-series'))); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('detail-cta'))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('player-play-toggle'))); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key('player-play-toggle')), findsOneWidget); + expect(find.byKey(const Key('home-feed-center-play')), findsNothing); + expect(find.byIcon(Icons.play_arrow_rounded), findsOneWidget); + }); + + test('should_only_show_feed_pause_indicator_in_home_mode', () { + expect( + shouldShowFeedPauseIndicator( + homeMode: true, + selected: true, + ready: true, + playing: false, + pip: false, + ), + isTrue, + ); + expect( + shouldShowFeedPauseIndicator( + homeMode: false, + selected: true, + ready: true, + playing: false, + pip: false, + ), + isFalse, + ); + expect( + shouldShowFeedPauseIndicator( + homeMode: true, + selected: true, + ready: true, + playing: true, + pip: false, + ), + isFalse, + ); + }); } void _expectFullscreenOverlay() {