opt player

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-08-04 20:26:07 +08:00
parent deb48d1ada
commit afb09e8a0a
7 changed files with 267 additions and 295 deletions

View File

@@ -121,6 +121,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
final GlobalKey relatedVideoPanelKey = GlobalKey();
final GlobalKey videoPlayerKey = GlobalKey();
final GlobalKey playerKey = GlobalKey();
final GlobalKey videoReplyPanelKey = GlobalKey();
late final GlobalKey ugcPanelKey = GlobalKey();
late final GlobalKey pgcPanelKey = GlobalKey();
@@ -188,24 +189,26 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
introController.startTimer();
videoDetailController.plPlayerController.showDanmaku = true;
if (!videoDetailController.plPlayerController.showDanmaku) {
introController.startTimer();
videoDetailController.plPlayerController.showDanmaku = true;
// 修复从后台恢复时全屏状态下屏幕方向错误的问题
if (isFullScreen && Platform.isIOS) {
WidgetsBinding.instance.addPostFrameCallback((_) {
// 根据视频方向重新设置屏幕方向
final isVertical = videoDetailController.isVertical.value;
final mode = plPlayerController?.mode;
// 修复从后台恢复时全屏状态下屏幕方向错误的问题
if (isFullScreen && Platform.isIOS) {
WidgetsBinding.instance.addPostFrameCallback((_) {
// 根据视频方向重新设置屏幕方向
final isVertical = videoDetailController.isVertical.value;
final mode = plPlayerController?.mode;
late final size = Get.size;
if (!(mode == FullScreenMode.vertical ||
(mode == FullScreenMode.auto && isVertical) ||
(mode == FullScreenMode.ratio &&
(isVertical || size.height / size.width < 1.25)))) {
landScape();
}
});
late final size = Get.size;
if (!(mode == FullScreenMode.vertical ||
(mode == FullScreenMode.auto && isVertical) ||
(mode == FullScreenMode.ratio &&
(isVertical || size.height / size.width < 1.25)))) {
landScape();
}
});
}
}
} else if (state == AppLifecycleState.paused) {
introController.canelTimer();
@@ -317,9 +320,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
return;
}
plPlayerController = videoDetailController.plPlayerController;
videoDetailController
..isShowCover.value = false
..autoPlay.value = true;
videoDetailController.autoPlay.value = true;
if (videoDetailController.plPlayerController.preInitPlayer) {
await plPlayerController!.play();
} else {
@@ -452,9 +453,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
}
}
super.didPopNext();
final isShowCover = videoDetailController.isShowCover.value;
videoDetailController.autoPlay.value = !isShowCover;
if (!isShowCover) {
if (videoDetailController.autoPlay.value) {
await videoDetailController.playerInit(
autoplay: videoDetailController.playerStatus == PlayerStatus.playing,
);
@@ -1212,41 +1211,8 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
),
);
Widget get childWhenEnabled => Obx(
() => !videoDetailController.autoPlay.value
? const SizedBox.shrink()
: PLVideoPlayer(
key: Key(heroTag),
plPlayerController: plPlayerController!,
videoDetailController: videoDetailController,
ugcIntroController: videoDetailController.isUgc
? ugcIntroController
: null,
pgcIntroController: videoDetailController.isUgc
? null
: pgcIntroController,
headerControl: HeaderControl(
controller: plPlayerController!,
videoDetailCtr: videoDetailController,
heroTag: heroTag,
),
danmuWidget: pipNoDanmaku
? null
: Obx(
() => PlDanmaku(
key: Key(videoDetailController.cid.value.toString()),
isPipMode: true,
cid: videoDetailController.cid.value,
playerController: plPlayerController!,
),
),
showEpisodes: showEpisodes,
showViewPoints: showViewPoints,
),
);
Widget get manualPlayerWidget => Obx(() {
if (videoDetailController.isShowCover.value) {
if (!videoDetailController.autoPlay.value) {
return Stack(
clipBehavior: Clip.none,
children: [
@@ -1387,15 +1353,15 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
return const SizedBox.shrink();
});
Widget get plPlayer => Obx(
Widget plPlayer([bool isPipMode = false]) => Obx(
key: videoPlayerKey,
() => videoDetailController.videoState.value is! Success
? const SizedBox.shrink()
: !videoDetailController.autoPlay.value ||
plPlayerController?.videoController == null
() =>
videoDetailController.videoState.value is! Success ||
!videoDetailController.autoPlay.value ||
plPlayerController?.videoController == null
? const SizedBox.shrink()
: PLVideoPlayer(
key: Key(heroTag),
key: playerKey,
plPlayerController: plPlayerController!,
videoDetailController: videoDetailController,
ugcIntroController: videoDetailController.isUgc
@@ -1410,13 +1376,17 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
videoDetailCtr: videoDetailController,
heroTag: heroTag,
),
danmuWidget: Obx(
() => PlDanmaku(
key: Key(videoDetailController.cid.value.toString()),
cid: videoDetailController.cid.value,
playerController: plPlayerController!,
),
),
danmuWidget: isPipMode && pipNoDanmaku
? null
: Obx(
() => PlDanmaku(
key: ValueKey(videoDetailController.cid.value),
isPipMode: isPipMode,
cid: videoDetailController.cid.value,
playerController: plPlayerController!,
isFullScreen: plPlayerController!.isFullScreen.value,
),
),
showEpisodes: showEpisodes,
showViewPoints: showViewPoints,
),
@@ -1424,7 +1394,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
Widget autoChoose(Widget childWhenDisabled) {
if (Platform.isAndroid) {
return Floating().isPipMode ? childWhenEnabled : childWhenDisabled;
return Floating().isPipMode ? plPlayer(true) : childWhenDisabled;
}
return childWhenDisabled;
}
@@ -1624,10 +1594,10 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
children: [
const Positioned.fill(child: ColoredBox(color: Colors.black)),
if (isShowing) plPlayer,
if (isShowing) plPlayer(),
Obx(() {
if (videoDetailController.isShowCover.value) {
if (!videoDetailController.autoPlay.value) {
return Positioned.fill(
child: GestureDetector(
onTap: handlePlay,