fix: 修复播放器重复暂停手势

This commit is contained in:
Zhou Weidong committed 2026-10-22 22:34:18 +08:00
1 parent 76c4b528d3
commit 5794dd4e4d
5 files changed
+52 -32

No files matched your search

+26 -9
View File
@@ -120,6 +120,8 @@ class _PlayerPageState extends State<PlayerPage>
bool _scrubbing = false;
double? _speedBeforeBoost;
bool? _chromeBeforeBoost;
bool _doubleTapHandling = false;
Timer? _doubleTapGuardTimer;
/// 收藏切换后的本地增量:基准是详情快照,切换成功按服务端状态 ±1。
final Map<String, int> _favoriteDelta = {};
@@ -261,6 +263,7 @@ class _PlayerPageState extends State<PlayerPage>
appRouteObserver.unsubscribe(this);
_spriteAxisService.dispose();
_thumbnailService.dispose();
_doubleTapGuardTimer?.cancel();
logic.dispose();
super.dispose();
}
@@ -333,7 +336,7 @@ class _PlayerPageState extends State<PlayerPage>
}
void _handleFeedSurfaceTap() {
if (_scrubbing) return;
if (_scrubbing || _doubleTapHandling) return;
if (!_chromeVisible) {
_restoreFeedChrome();
return;
@@ -341,6 +344,24 @@ class _PlayerPageState extends State<PlayerPage>
logic.session.setUserWantsPlay(!logic.session.userWantsPlay);
}
void _togglePlayback() {
if (_doubleTapHandling) return;
logic.session.setUserWantsPlay(!logic.session.userWantsPlay);
}
void _handleDoubleTapLike(
BuildContext context,
InteractionController interactions,
Episode episode,
) {
_doubleTapHandling = true;
_doubleTapGuardTimer?.cancel();
_doubleTapGuardTimer = Timer(const Duration(milliseconds: 300), () {
_doubleTapHandling = false;
});
unawaited(_toggleLike(context, interactions, episode, likeOnly: true));
}
/// 收藏状态确认后同步右侧计数(总数没有独立计数接口,按 ±1 跟随)。
void _applyFavoriteDelta(String dramaId, {required bool nowSaved}) {
setState(() {
@@ -516,7 +537,6 @@ class _PlayerPageState extends State<PlayerPage>
controller: videoPort?.controller,
videoUrl: videoPort?.controller.dataSource ?? episode.videoUrl,
theater: theater,
onTap: widget.homeMode ? () {} : _handleFeedSurfaceTap,
),
// 票据三态之一:起播前正在向后端要签名地址
if (selected && logic.ticketLoading)
@@ -634,9 +654,8 @@ class _PlayerPageState extends State<PlayerPage>
onLike: () async {
await _toggleLike(context, interactions, episode);
},
onDoubleTapLike: (_) => unawaited(
_toggleLike(context, interactions, episode, likeOnly: true),
),
onDoubleTapLike: (_) =>
_handleDoubleTapLike(context, interactions, episode),
onSave: () => unawaited(_toggleSave(context, drama)),
onComments: () => unawaited(_openComments(context, drama, episode)),
onShare: () => logic.shareDrama(context, drama),
@@ -686,8 +705,7 @@ class _PlayerPageState extends State<PlayerPage>
onBack: widget.embedded
? null
: () => unawaited(logic.leave(context)),
onTogglePlay: () =>
logic.session.setUserWantsPlay(!logic.session.userWantsPlay),
onTogglePlay: _togglePlayback,
onClear: () => setState(() => _chromeVisible = false),
onExitClear: () => setState(() => _chromeVisible = true),
onDetail: () => unawaited(logic.openDetail(context)),
@@ -743,8 +761,7 @@ class _PlayerPageState extends State<PlayerPage>
child: PlayerCenterToggle(
key: const Key('home-feed-center-play'),
playing: false,
onTap: () =>
logic.session.setUserWantsPlay(!logic.session.userWantsPlay),
onTap: _togglePlayback,
),
),
],