fix: 修复播放器重复暂停手势
This commit is contained in:
1 parent
76c4b528d3
commit
5794dd4e4d
5 files changed
+52
-32
No files matched your search
@@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
Reference in new issue
Block a user