From 569184a507c9233fb0bb5c599e61d6dd76ab9f8d Mon Sep 17 00:00:00 2001 From: orz12 Date: Mon, 22 Jan 2024 12:03:17 +0800 Subject: [PATCH 1/7] =?UTF-8?q?opt:=20=E5=88=87=E6=8D=A2=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=97=B6=E9=94=80=E6=AF=81=E6=92=AD=E6=94=BE=E5=99=A8=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E5=8D=87=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/view.dart | 78 ++++++++++++++++---------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 59fa39b2c..3d3c1c30c 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -61,6 +61,7 @@ class _VideoDetailPageState extends State final Floating floating = Floating(); // 生命周期监听 late final AppLifecycleListener _lifecycleListener; + bool isShowing = true; @override void initState() { @@ -216,15 +217,15 @@ class _VideoDetailPageState extends State videoIntroController.isPaused = true; plPlayerController!.removeStatusLister(playerListener); plPlayerController!.pause(); - plPlayerController!.danmakuController?.pause(); - plPlayerController!.danmakuController?.clear(); } + setState(() => isShowing = false); super.didPushNext(); } @override // 返回当前页面时 void didPopNext() async { + setState(() => isShowing = true); videoDetailController.isFirstTime = false; final bool autoplay = autoPlayEnable; videoDetailController.playerInit(autoplay: autoplay); @@ -354,44 +355,45 @@ class _VideoDetailPageState extends State boxConstraints.maxHeight; return Stack( children: [ - FutureBuilder( - future: _futureBuilderFuture, - builder: (BuildContext context, - AsyncSnapshot snapshot) { - if (snapshot.hasData && - snapshot.data['status']) { - return Obx( - () => !videoDetailController - .autoPlay.value - ? const SizedBox() - : PLVideoPlayer( - controller: - plPlayerController!, - headerControl: - videoDetailController - .headerControl, - danmuWidget: Obx( - () => PlDanmaku( - key: Key( - videoDetailController - .danmakuCid - .value - .toString()), - cid: - videoDetailController - .danmakuCid - .value, - playerController: - plPlayerController!, + if (isShowing) + FutureBuilder( + future: _futureBuilderFuture, + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.hasData && + snapshot.data['status']) { + return Obx( + () => !videoDetailController + .autoPlay.value + ? nil + : PLVideoPlayer( + controller: + plPlayerController!, + headerControl: + videoDetailController + .headerControl, + danmuWidget: Obx( + () => PlDanmaku( + key: Key( + videoDetailController + .danmakuCid + .value + .toString()), + cid: + videoDetailController + .danmakuCid + .value, + playerController: + plPlayerController!, + ), ), ), - ), - ); - } else { - return const SizedBox(); - } - }, - ), + ); + } else { + return const SizedBox(); + } + }, + ), /// 关闭自动播放时 手动播放 if (!videoDetailController From 103423abf7503e376a79039a74c56b82e5b5633d Mon Sep 17 00:00:00 2001 From: orz12 Date: Mon, 22 Jan 2024 12:04:00 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E6=A8=AA=E5=B1=8F=E4=B8=A4=E4=BE=A7=E4=B8=8D?= =?UTF-8?q?=E7=AD=89=E5=AE=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/view.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 3d3c1c30c..278e2c64c 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -292,8 +292,8 @@ class _VideoDetailPageState extends State plPlayerController?.isFullScreen.value == true, bottom: MediaQuery.of(context).orientation == Orientation.portrait && plPlayerController?.isFullScreen.value == true, - left: plPlayerController?.isFullScreen.value != true, - right: plPlayerController?.isFullScreen.value != true, + left: false,//plPlayerController?.isFullScreen.value != true, + right: false, //plPlayerController?.isFullScreen.value != true, child: Stack( children: [ Scaffold( From 1dd70f482fb2162992aeeb27f37a99e24698a7ab Mon Sep 17 00:00:00 2001 From: orz12 Date: Mon, 22 Jan 2024 12:54:32 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=E6=97=8B=E8=BD=AC=E6=A8=AA=E5=B1=8F?= =?UTF-8?q?=E4=BB=8D=E6=9C=89=E7=8A=B6=E6=80=81=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/view.dart | 362 ++++++++++++++++--------------- 1 file changed, 184 insertions(+), 178 deletions(-) diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 278e2c64c..507ea66ec 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -281,18 +281,12 @@ class _VideoDetailPageState extends State final double videoHeight = MediaQuery.sizeOf(context).width * 9 / 16; final double pinnedHeaderHeight = statusBarHeight + kToolbarHeight + videoHeight; - if (MediaQuery.of(context).orientation == Orientation.landscape || - plPlayerController?.isFullScreen.value == true) { - enterFullScreen(); - } else { - exitFullScreen(); - } Widget childWhenDisabled = SafeArea( top: MediaQuery.of(context).orientation == Orientation.portrait && plPlayerController?.isFullScreen.value == true, bottom: MediaQuery.of(context).orientation == Orientation.portrait && plPlayerController?.isFullScreen.value == true, - left: false,//plPlayerController?.isFullScreen.value != true, + left: false, //plPlayerController?.isFullScreen.value != true, right: false, //plPlayerController?.isFullScreen.value != true, child: Stack( children: [ @@ -313,185 +307,197 @@ class _VideoDetailPageState extends State (BuildContext context, bool innerBoxIsScrolled) { return [ Obx( - () => SliverAppBar( - automaticallyImplyLeading: false, - // 假装使用一个非空变量,避免Obx检测不到而罢工 - pinned: videoDetailController.autoPlay.value ^ - false ^ - videoDetailController.autoPlay.value, - elevation: 0, - scrolledUnderElevation: 0, - forceElevated: innerBoxIsScrolled, - expandedHeight: MediaQuery.of(context).orientation == - Orientation.landscape || - plPlayerController?.isFullScreen.value == true - ? MediaQuery.sizeOf(context).height - - (MediaQuery.of(context).orientation == - Orientation.landscape - ? 0 - : MediaQuery.of(context).padding.top) - : videoHeight, - backgroundColor: Colors.black, - flexibleSpace: FlexibleSpaceBar( - background: PopScope( - canPop: - plPlayerController?.isFullScreen.value != true, - onPopInvoked: (bool didPop) { - if (plPlayerController?.isFullScreen.value == - true) { - plPlayerController! - .triggerFullScreen(status: false); - } - if (MediaQuery.of(context).orientation == - Orientation.landscape) { - verticalScreen(); - } - }, - child: LayoutBuilder( - builder: (BuildContext context, - BoxConstraints boxConstraints) { - final double maxWidth = boxConstraints.maxWidth; - final double maxHeight = - boxConstraints.maxHeight; - return Stack( - children: [ - if (isShowing) - FutureBuilder( - future: _futureBuilderFuture, - builder: (BuildContext context, - AsyncSnapshot snapshot) { - if (snapshot.hasData && - snapshot.data['status']) { - return Obx( - () => !videoDetailController - .autoPlay.value - ? nil - : PLVideoPlayer( - controller: - plPlayerController!, - headerControl: - videoDetailController - .headerControl, - danmuWidget: Obx( - () => PlDanmaku( - key: Key( - videoDetailController - .danmakuCid - .value - .toString()), - cid: - videoDetailController - .danmakuCid - .value, - playerController: - plPlayerController!, - ), - ), - ), - ); - } else { - return const SizedBox(); - } - }, - ), + () { + if (MediaQuery.of(context).orientation == + Orientation.landscape || + plPlayerController?.isFullScreen.value == true) { + enterFullScreen(); + } else { + exitFullScreen(); + } + return SliverAppBar( + automaticallyImplyLeading: false, + // 假装使用一个非空变量,避免Obx检测不到而罢工 + pinned: videoDetailController.autoPlay.value ^ + false ^ + videoDetailController.autoPlay.value, + elevation: 0, + scrolledUnderElevation: 0, + forceElevated: innerBoxIsScrolled, + expandedHeight: MediaQuery.of(context).orientation == + Orientation.landscape || + plPlayerController?.isFullScreen.value == true + ? MediaQuery.sizeOf(context).height - + (MediaQuery.of(context).orientation == + Orientation.landscape + ? 0 + : MediaQuery.of(context).padding.top) + : videoHeight, + backgroundColor: Colors.black, + flexibleSpace: FlexibleSpaceBar( + background: PopScope( + canPop: plPlayerController?.isFullScreen.value != + true, + onPopInvoked: (bool didPop) { + if (plPlayerController?.isFullScreen.value == + true) { + plPlayerController! + .triggerFullScreen(status: false); + } + if (MediaQuery.of(context).orientation == + Orientation.landscape) { + verticalScreen(); + } + }, + child: LayoutBuilder( + builder: (BuildContext context, + BoxConstraints boxConstraints) { + final double maxWidth = + boxConstraints.maxWidth; + final double maxHeight = + boxConstraints.maxHeight; + return Stack( + children: [ + if (isShowing) + FutureBuilder( + future: _futureBuilderFuture, + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.hasData && + snapshot.data['status']) { + return Obx( + () => + !videoDetailController + .autoPlay.value + ? nil + : PLVideoPlayer( + controller: + plPlayerController!, + headerControl: + videoDetailController + .headerControl, + danmuWidget: Obx( + () => PlDanmaku( + key: Key(videoDetailController + .danmakuCid + .value + .toString()), + cid: videoDetailController + .danmakuCid + .value, + playerController: + plPlayerController!, + ), + ), + ), + ); + } else { + return const SizedBox(); + } + }, + ), - /// 关闭自动播放时 手动播放 - if (!videoDetailController - .autoPlay.value) ...[ - Obx( - () => Visibility( - visible: videoDetailController - .isShowCover.value, - child: Positioned( - top: 0, - left: 0, - right: 0, - child: GestureDetector( - onTap: () { - handlePlay(); - }, - child: NetworkImgLayer( - type: 'emote', - src: videoDetailController - .videoItem['pic'], - width: maxWidth, - height: maxHeight, + /// 关闭自动播放时 手动播放 + if (!videoDetailController + .autoPlay.value) ...[ + Obx( + () => Visibility( + visible: videoDetailController + .isShowCover.value, + child: Positioned( + top: 0, + left: 0, + right: 0, + child: GestureDetector( + onTap: () { + handlePlay(); + }, + child: NetworkImgLayer( + type: 'emote', + src: videoDetailController + .videoItem['pic'], + width: maxWidth, + height: maxHeight, + ), ), ), ), ), - ), - Obx( - () => Visibility( - visible: videoDetailController - .isShowCover.value && - videoDetailController - .isEffective.value, - child: Stack( - children: [ - Positioned( - top: 0, - left: 0, - right: 0, - child: AppBar( - primary: false, - foregroundColor: - Colors.white, - elevation: 0, - scrolledUnderElevation: 0, - backgroundColor: - Colors.transparent, - actions: [ - IconButton( - tooltip: '稍后再看', - onPressed: () async { - var res = await UserHttp - .toViewLater( - bvid: - videoDetailController - .bvid); - SmartDialog.showToast( - res['msg']); - }, - icon: const Icon(Icons - .history_outlined), - ), - const SizedBox(width: 14) - ], - ), - ), - Positioned( - right: 12, - bottom: 10, - child: TextButton.icon( - style: ButtonStyle( + Obx( + () => Visibility( + visible: videoDetailController + .isShowCover.value && + videoDetailController + .isEffective.value, + child: Stack( + children: [ + Positioned( + top: 0, + left: 0, + right: 0, + child: AppBar( + primary: false, + foregroundColor: + Colors.white, + elevation: 0, + scrolledUnderElevation: 0, backgroundColor: - MaterialStateProperty - .resolveWith( - (states) { - return Colors.white - .withOpacity(0.8); - }), + Colors.transparent, + actions: [ + IconButton( + tooltip: '稍后再看', + onPressed: () async { + var res = await UserHttp + .toViewLater( + bvid: videoDetailController + .bvid); + SmartDialog + .showToast( + res['msg']); + }, + icon: const Icon(Icons + .history_outlined), + ), + const SizedBox( + width: 14) + ], ), - onPressed: () => - handlePlay(), - icon: const Icon( - Icons.play_circle_outline, - size: 20, - ), - label: const Text('轻触封面播放'), ), - ), - ], - )), - ), - ] - ], - ); - }, - )), - ), - ), + Positioned( + right: 12, + bottom: 10, + child: TextButton.icon( + style: ButtonStyle( + backgroundColor: + MaterialStateProperty + .resolveWith( + (states) { + return Colors.white + .withOpacity(0.8); + }), + ), + onPressed: () => + handlePlay(), + icon: const Icon( + Icons + .play_circle_outline, + size: 20, + ), + label: + const Text('轻触封面播放'), + ), + ), + ], + )), + ), + ] + ], + ); + }, + )), + ), + ); + }, ), ]; }, From a68c04001b883636cce6c432bc86f6f8c427aa3a Mon Sep 17 00:00:00 2001 From: orz12 Date: Mon, 22 Jan 2024 13:19:29 +0800 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20=E7=AB=96=E5=B1=8F=E5=85=A8=E5=B1=8F?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 507ea66ec..dec474bae 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -304,7 +304,7 @@ class _VideoDetailPageState extends State body: ExtendedNestedScrollView( controller: _extendNestCtr, headerSliverBuilder: - (BuildContext context, bool innerBoxIsScrolled) { + (BuildContext context2, bool innerBoxIsScrolled) { return [ Obx( () { From 16895b5c32a2e26522323f4d40cc62c7f7a7a17f Mon Sep 17 00:00:00 2001 From: orz12 Date: Tue, 23 Jan 2024 15:12:52 +0800 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=E7=82=B9=E5=87=BB=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E8=AF=84=E8=AE=BA=E5=8C=BA=E7=94=A8=E6=88=B7=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E5=90=8E=E8=BF=94=E5=9B=9E=E8=AF=A6=E6=83=85=E9=A1=B5=E7=81=B0?= =?UTF-8?q?=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/related/controller.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/video/detail/related/controller.dart b/lib/pages/video/detail/related/controller.dart index eb1a14d5f..f7042871a 100644 --- a/lib/pages/video/detail/related/controller.dart +++ b/lib/pages/video/detail/related/controller.dart @@ -4,7 +4,7 @@ import 'package:pilipala/http/video.dart'; class ReleatedController extends GetxController { // 视频aid - String bvid = Get.parameters['bvid']!; + String bvid = Get.parameters['bvid'] ?? ""; // 推荐视频列表 List relatedVideoList = []; From aaeecc9e531d3340bce5a02074286e79d4015d6a Mon Sep 17 00:00:00 2001 From: orz12 Date: Wed, 24 Jan 2024 11:01:54 +0800 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=E9=87=8D=E5=8A=9B=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E5=90=8E=E5=88=92=E5=87=BA=E4=B8=8B=E6=96=B9=E7=9A=84=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/view.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index dec474bae..1ce78b3c7 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -508,7 +508,9 @@ class _VideoDetailPageState extends State // }, /// 不收回 pinnedHeaderSliverHeightBuilder: () { - return plPlayerController?.isFullScreen.value == true + return MediaQuery.of(context).orientation == + Orientation.landscape || + plPlayerController?.isFullScreen.value == true ? MediaQuery.sizeOf(context).height : pinnedHeaderHeight; }, From 545def36e6a6b8ec64fcbc038712f86099041308 Mon Sep 17 00:00:00 2001 From: orz12 Date: Thu, 25 Jan 2024 12:59:21 +0800 Subject: [PATCH 7/7] =?UTF-8?q?mod:=20=E8=87=AA=E5=8A=A8=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E6=94=B9=E4=B8=BA=E5=AE=98=E6=96=B9=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/view.dart | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 1ce78b3c7..3644fa41d 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -466,26 +466,15 @@ class _VideoDetailPageState extends State Positioned( right: 12, bottom: 10, - child: TextButton.icon( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty - .resolveWith( - (states) { - return Colors.white - .withOpacity(0.8); - }), - ), - onPressed: () => - handlePlay(), - icon: const Icon( - Icons - .play_circle_outline, - size: 20, - ), - label: - const Text('轻触封面播放'), - ), + child: IconButton( + tooltip: '播放', + onPressed: () => + handlePlay(), + icon: Image.asset( + 'assets/images/play.png', + width: 60, + height: 60, + )), ), ], )),