From af1cd30ed7774e6ee4e8d472e83e63c2a806e8bc Mon Sep 17 00:00:00 2001 From: dom Date: Wed, 3 Jun 2026 23:10:41 +0800 Subject: [PATCH] opt video bottomsheet Signed-off-by: dom --- .../widgets/fractionally_sized_box.dart | 11 ++++--- lib/pages/video/controller.dart | 3 -- lib/pages/video/view.dart | 2 -- lib/pages/video/widgets/header_control.dart | 2 +- lib/pages/video/widgets/header_mixin.dart | 3 +- lib/services/shutdown_timer_service.dart | 1 - lib/utils/page_utils.dart | 30 ++++++------------- 7 files changed, 18 insertions(+), 34 deletions(-) diff --git a/lib/common/widgets/fractionally_sized_box.dart b/lib/common/widgets/fractionally_sized_box.dart index adf4679d2..558404fb2 100644 --- a/lib/common/widgets/fractionally_sized_box.dart +++ b/lib/common/widgets/fractionally_sized_box.dart @@ -7,10 +7,10 @@ class CustomFractionallySizedBox extends FractionallySizedBox { const CustomFractionallySizedBox({ super.key, super.alignment, - super.widthFactor, - super.heightFactor, - super.child, + required double super.widthFactor, + required double super.heightFactor, required this.maxWidth, + super.child, }); final double maxWidth; @@ -44,7 +44,10 @@ class CustomRenderFractionallySizedOverflowBox double minWidth = constraints.minWidth; double maxWidth = constraints.maxWidth; if (widthFactor != null) { - final double width = math.min(_maxWidth, maxWidth * widthFactor!); + double width = maxWidth * widthFactor!; + if (maxWidth > constraints.maxHeight) { + width = math.min(_maxWidth, width); + } minWidth = width; maxWidth = width; } diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index ddc8eaaac..d4d1014ab 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -533,7 +533,6 @@ class VideoDetailController extends GetxController child: plPlayerController.darkVideoPage ? Theme(data: ThemeUtils.darkTheme, child: panel()) : panel(), - isFullScreen: () => plPlayerController.isFullScreen.value, ); } else { childKey.currentState?.showBottomSheet( @@ -1049,7 +1048,6 @@ class VideoDetailController extends GetxController videoDetailController: this, plPlayerController: plPlayerController, ), - isFullScreen: () => plPlayerController.isFullScreen.value, ); } else { childKey.currentState?.showBottomSheet( @@ -1392,7 +1390,6 @@ class VideoDetailController extends GetxController isStein: graphVersion != null, title: title, ), - isFullScreen: () => plPlayerController.isFullScreen.value, ); } else { childKey.currentState?.showBottomSheet( diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 19614e10f..8f1bc934b 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -1998,7 +1998,6 @@ class _VideoDetailPageVState extends State if (isFullScreen || videoDetailController.showVideoSheet) { PageUtils.showVideoBottomSheet( context, - isFullScreen: () => isFullScreen, child: videoDetailController.plPlayerController.darkVideoPage ? Theme( data: themeData, @@ -2078,7 +2077,6 @@ class _VideoDetailPageVState extends State if (isFullScreen || videoDetailController.showVideoSheet) { PageUtils.showVideoBottomSheet( context, - isFullScreen: () => isFullScreen, child: videoDetailController.plPlayerController.darkVideoPage ? Theme( data: themeData, diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index eed3f7b46..81e96e979 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -1247,7 +1247,7 @@ class HeaderControlState extends State /// 字幕设置 void showSetSubtitle() { showBottomSheet( - padding: isFullScreen ? 70 : null, + padding: () => isFullScreen ? const .only(bottom: 70) : .zero, (context, setState) { final theme = Theme.of(context); diff --git a/lib/pages/video/widgets/header_mixin.dart b/lib/pages/video/widgets/header_mixin.dart index 8fff7a106..6012907df 100644 --- a/lib/pages/video/widgets/header_mixin.dart +++ b/lib/pages/video/widgets/header_mixin.dart @@ -14,12 +14,11 @@ mixin HeaderMixin on State { Future? showBottomSheet( StatefulWidgetBuilder builder, { - double? padding, + ValueGetter? padding, }) { return PageUtils.showVideoBottomSheet( context, maxWidth: 512, - isFullScreen: () => isFullScreen, padding: padding, child: StatefulBuilder( builder: (context, setState) => plPlayerController.darkVideoPage diff --git a/lib/services/shutdown_timer_service.dart b/lib/services/shutdown_timer_service.dart index d91a049b4..c3bbebe38 100644 --- a/lib/services/shutdown_timer_service.dart +++ b/lib/services/shutdown_timer_service.dart @@ -148,7 +148,6 @@ class ShutdownTimerService { PageUtils.showVideoBottomSheet( context, maxWidth: 512, - isFullScreen: () => isFullScreen, child: StatefulBuilder( builder: (_, setState) { final ThemeData theme = Theme.of(context); diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index e9b829c2d..492e61317 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -495,8 +495,7 @@ abstract final class PageUtils { static Future? showVideoBottomSheet( BuildContext context, { required Widget child, - required ValueGetter isFullScreen, - double? padding, + ValueGetter? padding, double maxWidth = 500, }) { if (!context.mounted) { @@ -505,28 +504,17 @@ abstract final class PageUtils { return Get.key.currentState!.push( PublishRoute( pageBuilder: (context, animation, secondaryAnimation) { - if (context.isPortrait) { - return SafeArea( - child: FractionallySizedBox( - heightFactor: 0.7, - widthFactor: 1.0, - alignment: Alignment.bottomCenter, - child: isFullScreen() && padding != null - ? Padding( - padding: EdgeInsets.only(bottom: padding), - child: child, - ) - : child, - ), - ); - } + final isPortrait = context.isPortrait; return SafeArea( child: CustomFractionallySizedBox( maxWidth: maxWidth, - widthFactor: 0.5, - heightFactor: 1.0, - alignment: Alignment.centerRight, - child: child, + widthFactor: isPortrait ? 1.0 : 0.5, + heightFactor: isPortrait ? 0.7 : 1.0, + alignment: isPortrait ? .bottomCenter : .centerRight, + child: Padding( + padding: isPortrait ? padding?.call() ?? .zero : .zero, + child: child, + ), ), ); },