From 6fdfcb888d968a871aa80cb9dd63530fba2fa6bb Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 10 Mar 2024 19:41:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=92=AD=E6=94=BE=E5=99=A8=E5=BA=95?= =?UTF-8?q?=E9=83=A8=E6=8E=A7=E5=88=B6=E6=A0=8F=E8=87=AA=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pl_player/models/bottom_control_type.dart | 10 + lib/plugin/pl_player/view.dart | 300 ++++++++++++------ .../pl_player/widgets/bottom_control.dart | 177 ++++++----- 3 files changed, 296 insertions(+), 191 deletions(-) create mode 100644 lib/plugin/pl_player/models/bottom_control_type.dart diff --git a/lib/plugin/pl_player/models/bottom_control_type.dart b/lib/plugin/pl_player/models/bottom_control_type.dart new file mode 100644 index 000000000..599f6e4fe --- /dev/null +++ b/lib/plugin/pl_player/models/bottom_control_type.dart @@ -0,0 +1,10 @@ +enum BottomControlType { + pre, + playOrPause, + next, + time, + space, + fit, + speed, + fullscreen, +} diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 988ec26db..0b2e652e4 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -8,7 +8,6 @@ import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; -import 'package:nil/nil.dart'; import 'package:pilipala/models/common/gesture_mode.dart'; import 'package:pilipala/plugin/pl_player/controller.dart'; import 'package:pilipala/plugin/pl_player/models/duration.dart'; @@ -19,12 +18,14 @@ import 'package:pilipala/utils/storage.dart'; import 'package:screen_brightness/screen_brightness.dart'; import '../../utils/global_data.dart'; +import 'models/bottom_control_type.dart'; import 'models/bottom_progress_behavior.dart'; import 'widgets/app_bar_ani.dart'; import 'widgets/backward_seek.dart'; import 'widgets/bottom_control.dart'; import 'widgets/common_btn.dart'; import 'widgets/forward_seek.dart'; +import 'widgets/play_pause_btn.dart'; class PLVideoPlayer extends StatefulWidget { const PLVideoPlayer({ @@ -32,6 +33,7 @@ class PLVideoPlayer extends StatefulWidget { this.headerControl, this.bottomControl, this.danmuWidget, + this.bottomList, super.key, }); @@ -39,6 +41,7 @@ class PLVideoPlayer extends StatefulWidget { final PreferredSizeWidget? headerControl; final PreferredSizeWidget? bottomControl; final Widget? danmuWidget; + final List? bottomList; @override State createState() => _PLVideoPlayerState(); @@ -48,26 +51,22 @@ class _PLVideoPlayerState extends State with TickerProviderStateMixin { late AnimationController animationController; late VideoController videoController; - final PLVideoPlayerController _ctr = Get.put(PLVideoPlayerController()); - // bool _mountSeekBackwardButton = false; - // bool _mountSeekForwardButton = false; - // bool _hideSeekBackwardButton = false; - // bool _hideSeekForwardButton = false; + final RxBool _mountSeekBackwardButton = false.obs; + final RxBool _mountSeekForwardButton = false.obs; + final RxBool _hideSeekBackwardButton = false.obs; + final RxBool _hideSeekForwardButton = false.obs; - // double _brightnessValue = 0.0; - // bool _brightnessIndicator = false; + final RxDouble _brightnessValue = 0.0.obs; + final RxBool _brightnessIndicator = false.obs; Timer? _brightnessTimer; - // double _volumeValue = 0.0; - // bool _volumeIndicator = false; + final RxDouble _volumeValue = 0.0.obs; + final RxBool _volumeIndicator = false.obs; Timer? _volumeTimer; - double _distance = 0.0; - // 初始手指落下位置 - // double _initTapPositoin = 0.0; - - // bool _volumeInterceptEventStream = false; + final RxDouble _distance = 0.0.obs; + final RxBool _volumeInterceptEventStream = false.obs; Box setting = GStrorage.setting; late FullScreenMode mode; @@ -82,11 +81,11 @@ class _PLVideoPlayerState extends State DateTime? lastFullScreenToggleTime; void onDoubleTapSeekBackward() { - _ctr.onDoubleTapSeekBackward(); + _mountSeekBackwardButton.value = true; } void onDoubleTapSeekForward() { - _ctr.onDoubleTapSeekForward(); + _mountSeekForwardButton.value = true; } // 双击播放、暂停 @@ -138,10 +137,10 @@ class _PLVideoPlayerState extends State Future.microtask(() async { try { FlutterVolumeController.updateShowSystemUI(true); - _ctr.volumeValue.value = (await FlutterVolumeController.getVolume())!; + _volumeValue.value = (await FlutterVolumeController.getVolume())!; FlutterVolumeController.addListener((double value) { - if (mounted && !_ctr.volumeInterceptEventStream.value) { - _ctr.volumeValue.value = value; + if (mounted && !_volumeInterceptEventStream.value) { + _volumeValue.value = value; } }); } catch (_) {} @@ -149,10 +148,10 @@ class _PLVideoPlayerState extends State Future.microtask(() async { try { - _ctr.brightnessValue.value = await ScreenBrightness().current; + _brightnessValue.value = await ScreenBrightness().current; ScreenBrightness().onCurrentBrightnessChanged.listen((double value) { if (mounted) { - _ctr.brightnessValue.value = value; + _brightnessValue.value = value; } }); } catch (_) {} @@ -164,14 +163,14 @@ class _PLVideoPlayerState extends State FlutterVolumeController.updateShowSystemUI(false); await FlutterVolumeController.setVolume(value); } catch (_) {} - _ctr.volumeValue.value = value; - _ctr.volumeIndicator.value = true; - _ctr.volumeInterceptEventStream.value = true; + _volumeValue.value = value; + _volumeIndicator.value = true; + _volumeInterceptEventStream.value = true; _volumeTimer?.cancel(); _volumeTimer = Timer(const Duration(milliseconds: 200), () { if (mounted) { - _ctr.volumeIndicator.value = false; - _ctr.volumeInterceptEventStream.value = false; + _volumeIndicator.value = false; + _volumeInterceptEventStream.value = false; } }); } @@ -180,11 +179,11 @@ class _PLVideoPlayerState extends State try { await ScreenBrightness().setScreenBrightness(value); } catch (_) {} - _ctr.brightnessIndicator.value = true; + _brightnessIndicator.value = true; _brightnessTimer?.cancel(); _brightnessTimer = Timer(const Duration(milliseconds: 200), () { if (mounted) { - _ctr.brightnessIndicator.value = false; + _brightnessIndicator.value = false; } }); widget.controller.brightness.value = value; @@ -197,6 +196,134 @@ class _PLVideoPlayerState extends State super.dispose(); } + // 动态构建底部控制条 + List buildBottomControl() { + const TextStyle textStyle = TextStyle( + color: Colors.white, + fontSize: 12, + ); + final PlPlayerController _ = widget.controller; + Map videoProgressWidgets = { + /// 上一集 + BottomControlType.pre: ComBtn( + icon: const Icon( + Icons.skip_previous_outlined, + size: 15, + color: Colors.white, + ), + fuc: () {}, + ), + + /// 播放暂停 + BottomControlType.playOrPause: PlayOrPauseButton( + controller: _, + ), + + /// 下一集 + BottomControlType.next: ComBtn( + icon: const Icon( + Icons.last_page_outlined, + size: 15, + color: Colors.white, + ), + fuc: () {}, + ), + + /// 时间进度 + BottomControlType.time: Row( + children: [ + Obx(() { + return Text( + _.durationSeconds.value >= 3600 + ? printDurationWithHours( + Duration(seconds: _.positionSeconds.value)) + : printDuration(Duration(seconds: _.positionSeconds.value)), + style: textStyle, + ); + }), + const SizedBox(width: 2), + const Text('/', style: textStyle), + const SizedBox(width: 2), + Obx( + () => Text( + _.durationSeconds.value >= 3600 + ? printDurationWithHours( + Duration(seconds: _.durationSeconds.value)) + : printDuration(Duration(seconds: _.durationSeconds.value)), + style: textStyle, + ), + ), + ], + ), + + /// 空白占位 + BottomControlType.space: const Spacer(), + + /// 画面比例 + BottomControlType.fit: SizedBox( + height: 30, + child: TextButton( + onPressed: () => _.toggleVideoFit(), + style: ButtonStyle( + padding: MaterialStateProperty.all(EdgeInsets.zero), + ), + child: Obx( + () => Text( + _.videoFitDEsc.value, + style: const TextStyle(color: Colors.white, fontSize: 13), + ), + ), + ), + ), + + /// 播放速度 + BottomControlType.speed: SizedBox( + width: 45, + height: 34, + child: TextButton( + style: ButtonStyle( + padding: MaterialStateProperty.all(EdgeInsets.zero), + ), + onPressed: () {}, + child: Obx( + () => Text( + '${_.playbackSpeed.toString()}X', + style: textStyle, + ), + ), + ), + ), + + /// 字幕 + /// 全屏 + BottomControlType.fullscreen: ComBtn( + icon: Obx( + () => Icon( + _.isFullScreen.value + ? FontAwesomeIcons.compress + : FontAwesomeIcons.expand, + size: 15, + color: Colors.white, + ), + ), + fuc: () => _.triggerFullScreen(), + ), + }; + final List list = []; + var userSpecifyItem = widget.bottomList ?? + [ + BottomControlType.playOrPause, + BottomControlType.time, + BottomControlType.space, + BottomControlType.fit, + BottomControlType.fullscreen, + ]; + for (var i = 0; i < userSpecifyItem.length; i++) { + list.add(videoProgressWidgets[userSpecifyItem[i]]!); + } + return list; + } + @override Widget build(BuildContext context) { final PlPlayerController _ = widget.controller; @@ -316,7 +443,7 @@ class _PLVideoPlayerState extends State () => Align( child: AnimatedOpacity( curve: Curves.easeInOut, - opacity: _ctr.volumeIndicator.value ? 1.0 : 0.0, + opacity: _volumeIndicator.value ? 1.0 : 0.0, duration: const Duration(milliseconds: 150), child: Container( alignment: Alignment.center, @@ -335,9 +462,9 @@ class _PLVideoPlayerState extends State width: 28.0, alignment: Alignment.centerRight, child: Icon( - _ctr.volumeValue.value == 0.0 + _volumeValue.value == 0.0 ? Icons.volume_off - : _ctr.volumeValue.value < 0.5 + : _volumeValue.value < 0.5 ? Icons.volume_down : Icons.volume_up, color: const Color(0xFFFFFFFF), @@ -346,7 +473,7 @@ class _PLVideoPlayerState extends State ), Expanded( child: Text( - '${(_ctr.volumeValue.value * 100.0).round()}%', + '${(_volumeValue.value * 100.0).round()}%', textAlign: TextAlign.center, style: const TextStyle( fontSize: 13.0, @@ -367,7 +494,7 @@ class _PLVideoPlayerState extends State () => Align( child: AnimatedOpacity( curve: Curves.easeInOut, - opacity: _ctr.brightnessIndicator.value ? 1.0 : 0.0, + opacity: _brightnessIndicator.value ? 1.0 : 0.0, duration: const Duration(milliseconds: 150), child: Container( alignment: Alignment.center, @@ -386,9 +513,9 @@ class _PLVideoPlayerState extends State width: 28.0, alignment: Alignment.centerRight, child: Icon( - _ctr.brightnessValue.value < 1.0 / 3.0 + _brightnessValue.value < 1.0 / 3.0 ? Icons.brightness_low - : _ctr.brightnessValue.value < 2.0 / 3.0 + : _brightnessValue.value < 2.0 / 3.0 ? Icons.brightness_medium : Icons.brightness_high, color: const Color(0xFFFFFFFF), @@ -398,7 +525,7 @@ class _PLVideoPlayerState extends State const SizedBox(width: 2.0), Expanded( child: Text( - '${(_ctr.brightnessValue.value * 100.0).round()}%', + '${(_brightnessValue.value * 100.0).round()}%', textAlign: TextAlign.center, style: const TextStyle( fontSize: 13.0, @@ -489,7 +616,6 @@ class _PLVideoPlayerState extends State pos.clamp(Duration.zero, _.duration.value); _.onUpdatedSliderProgress(result); _.onChangedSliderStart(); - // _initTapPositoin = tapPosition; }, onHorizontalDragEnd: (DragEndDetails details) { if (_.videoType.value == 'live' || _.controlsLock.value) { @@ -521,7 +647,7 @@ class _PLVideoPlayerState extends State : screenWidth * 9 / 16) * 3; final double brightness = - _ctr.brightnessValue.value - delta / level; + _brightnessValue.value - delta / level; final double result = brightness.clamp(0.0, 1.0); setBrightness(result); } else if (tapPosition < sectionWidth * 2) { @@ -530,29 +656,29 @@ class _PLVideoPlayerState extends State const double threshold = 7.0; // 滑动阈值 final bool flag = fullScreenGestureMode != FullScreenGestureMode.values.last; - if (dy > _distance && dy > threshold) { + if (dy > _distance.value && dy > threshold) { if (_.isFullScreen.value ^ flag) { lastFullScreenToggleTime = DateTime.now(); // 下滑退出全屏 await widget.controller.triggerFullScreen(status: flag); } - _distance = 0.0; - } else if (dy < _distance && dy < -threshold) { + _distance.value = 0.0; + } else if (dy < _distance.value && dy < -threshold) { if (!_.isFullScreen.value ^ flag) { lastFullScreenToggleTime = DateTime.now(); // 上滑进入全屏 await widget.controller.triggerFullScreen(status: !flag); } - _distance = 0.0; + _distance.value = 0.0; } - _distance = dy; + _distance.value = dy; } else { // 右边区域 👈 final double level = (_.isFullScreen.value ? Get.size.height : screenWidth * 9 / 16) * 3; - final double volume = _ctr.volumeValue.value - delta / level; + final double volume = _volumeValue.value - delta / level; final double result = volume.clamp(0.0, 1.0); setVolume(result); } @@ -585,9 +711,10 @@ class _PLVideoPlayerState extends State position: 'bottom', child: widget.bottomControl ?? BottomControl( - controller: widget.controller, - triggerFullScreen: - widget.controller.triggerFullScreen), + controller: widget.controller, + triggerFullScreen: _.triggerFullScreen, + buildBottomControl: buildBottomControl(), + ), ), ), ], @@ -607,23 +734,23 @@ class _PLVideoPlayerState extends State } if (defaultBtmProgressBehavior == BtmProgresBehavior.alwaysHide.code) { - return nil; + return const SizedBox(); } if (defaultBtmProgressBehavior == BtmProgresBehavior.onlyShowFullScreen.code && !_.isFullScreen.value) { - return nil; + return const SizedBox(); } else if (defaultBtmProgressBehavior == BtmProgresBehavior.onlyHideFullScreen.code && _.isFullScreen.value) { - return nil; + return const SizedBox(); } if (_.videoType.value == 'live') { return const SizedBox(); } if (value > max || max <= 0) { - return nil; + return const SizedBox(); } return Positioned( bottom: -1.5, @@ -720,18 +847,17 @@ class _PLVideoPlayerState extends State /// 点击 快进/快退 Obx( () => Visibility( - visible: _ctr.mountSeekBackwardButton.value || - _ctr.mountSeekForwardButton.value, + visible: + _mountSeekBackwardButton.value || _mountSeekForwardButton.value, child: Positioned.fill( child: Row( children: [ Expanded( - child: _ctr.mountSeekBackwardButton.value + child: _mountSeekBackwardButton.value ? TweenAnimationBuilder( tween: Tween( begin: 0.0, - end: - _ctr.hideSeekBackwardButton.value ? 0.0 : 1.0, + end: _hideSeekBackwardButton.value ? 0.0 : 1.0, ), duration: const Duration(milliseconds: 500), builder: (BuildContext context, double value, @@ -741,17 +867,15 @@ class _PLVideoPlayerState extends State child: child, ), onEnd: () { - if (_ctr.hideSeekBackwardButton.value) { - _ctr.hideSeekBackwardButton.value = false; - _ctr.mountSeekBackwardButton.value = false; + if (_hideSeekBackwardButton.value) { + _hideSeekBackwardButton.value = false; + _mountSeekBackwardButton.value = false; } }, child: BackwardSeekIndicator( - onChanged: (Duration value) { - // _seekBarDeltaValueNotifier.value = -value; - }, + onChanged: (Duration value) => {}, onSubmitted: (Duration value) { - _ctr.hideSeekBackwardButton.value = true; + _hideSeekBackwardButton.value = true; final Player player = widget.controller.videoPlayerController!; Duration result = player.state.position - value; @@ -764,7 +888,7 @@ class _PLVideoPlayerState extends State }, ), ) - : nil, + : const SizedBox(), ), Expanded( child: SizedBox( @@ -772,11 +896,11 @@ class _PLVideoPlayerState extends State ), ), Expanded( - child: _ctr.mountSeekForwardButton.value + child: _mountSeekForwardButton.value ? TweenAnimationBuilder( tween: Tween( begin: 0.0, - end: _ctr.hideSeekForwardButton.value ? 0.0 : 1.0, + end: _hideSeekForwardButton.value ? 0.0 : 1.0, ), duration: const Duration(milliseconds: 500), builder: (BuildContext context, double value, @@ -786,17 +910,15 @@ class _PLVideoPlayerState extends State child: child, ), onEnd: () { - if (_ctr.hideSeekForwardButton.value) { - _ctr.hideSeekForwardButton.value = false; - _ctr.mountSeekForwardButton.value = false; + if (_hideSeekForwardButton.value) { + _hideSeekForwardButton.value = false; + _mountSeekForwardButton.value = false; } }, child: ForwardSeekIndicator( - onChanged: (Duration value) { - // _seekBarDeltaValueNotifier.value = value; - }, + onChanged: (Duration value) => {}, onSubmitted: (Duration value) { - _ctr.hideSeekForwardButton.value = true; + _hideSeekForwardButton.value = true; final Player player = widget.controller.videoPlayerController!; Duration result = player.state.position + value; @@ -809,7 +931,7 @@ class _PLVideoPlayerState extends State }, ), ) - : nil, + : const SizedBox(), ), ], ), @@ -820,31 +942,3 @@ class _PLVideoPlayerState extends State ); } } - -class PLVideoPlayerController extends GetxController { - RxBool mountSeekBackwardButton = false.obs; - RxBool mountSeekForwardButton = false.obs; - RxBool hideSeekBackwardButton = false.obs; - RxBool hideSeekForwardButton = false.obs; - - RxDouble brightnessValue = 0.0.obs; - RxBool brightnessIndicator = false.obs; - - RxDouble volumeValue = 0.0.obs; - RxBool volumeIndicator = false.obs; - - RxDouble distance = 0.0.obs; - // 初始手指落下位置 - RxDouble initTapPositoin = 0.0.obs; - - RxBool volumeInterceptEventStream = false.obs; - - // 双击快进 展示样式 - void onDoubleTapSeekForward() { - mountSeekForwardButton.value = true; - } - - void onDoubleTapSeekBackward() { - mountSeekBackwardButton.value = true; - } -} diff --git a/lib/plugin/pl_player/widgets/bottom_control.dart b/lib/plugin/pl_player/widgets/bottom_control.dart index 8f21fc175..ebb71b54c 100644 --- a/lib/plugin/pl_player/widgets/bottom_control.dart +++ b/lib/plugin/pl_player/widgets/bottom_control.dart @@ -1,17 +1,20 @@ import 'package:audio_video_progress_bar/audio_video_progress_bar.dart'; import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; import 'package:nil/nil.dart'; import 'package:pilipala/plugin/pl_player/index.dart'; -import 'package:pilipala/plugin/pl_player/widgets/play_pause_btn.dart'; import 'package:pilipala/utils/feed_back.dart'; class BottomControl extends StatelessWidget implements PreferredSizeWidget { final PlPlayerController? controller; final Function? triggerFullScreen; - const BottomControl({this.controller, this.triggerFullScreen, Key? key}) - : super(key: key); + final List? buildBottomControl; + const BottomControl({ + this.controller, + this.triggerFullScreen, + this.buildBottomControl, + Key? key, + }) : super(key: key); @override Size get preferredSize => const Size(double.infinity, kToolbarHeight); @@ -20,11 +23,6 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { Widget build(BuildContext context) { Color colorTheme = Theme.of(context).colorScheme.primary; final _ = controller!; - const textStyle = TextStyle( - color: Colors.white, - fontSize: 12, - ); - return Container( color: Colors.transparent, height: 90, @@ -71,86 +69,89 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { }, ), Row( - children: [ - PlayOrPauseButton( - controller: _, - ), - const SizedBox(width: 4), - // 播放时间 - Obx(() { - return Text( - _.durationSeconds.value >= 3600 - ? printDurationWithHours( - Duration(seconds: _.positionSeconds.value)) - : printDuration( - Duration(seconds: _.positionSeconds.value)), - style: textStyle, - ); - }), - const SizedBox(width: 2), - const Text('/', style: textStyle), - const SizedBox(width: 2), - Obx( - () => Text( - _.durationSeconds.value >= 3600 - ? printDurationWithHours( - Duration(seconds: _.durationSeconds.value)) - : printDuration( - Duration(seconds: _.durationSeconds.value)), - style: textStyle, - ), - ), - const Spacer(), - // 倍速 - // Obx( - // () => SizedBox( - // width: 45, - // height: 34, - // child: TextButton( - // style: ButtonStyle( - // padding: MaterialStateProperty.all(EdgeInsets.zero), - // ), - // onPressed: () { - // _.togglePlaybackSpeed(); - // }, - // child: Text( - // '${_.playbackSpeed.toString()}X', - // style: textStyle, - // ), - // ), - // ), - // ), - SizedBox( - height: 30, - child: TextButton( - onPressed: () => _.toggleVideoFit(), - style: ButtonStyle( - padding: MaterialStateProperty.all(EdgeInsets.zero), - ), - child: Obx( - () => Text( - _.videoFitDEsc.value, - style: const TextStyle(color: Colors.white, fontSize: 13), - ), - ), - ), - ), - const SizedBox(width: 10), - // 全屏 - Obx( - () => ComBtn( - icon: Icon( - _.isFullScreen.value - ? FontAwesomeIcons.compress - : FontAwesomeIcons.expand, - size: 15, - color: Colors.white, - ), - fuc: () => triggerFullScreen!(), - ), - ), - ], + children: [...buildBottomControl!], ), + // Row( + // children: [ + // PlayOrPauseButton( + // controller: _, + // ), + // const SizedBox(width: 4), + // // 播放时间 + // Obx(() { + // return Text( + // _.durationSeconds.value >= 3600 + // ? printDurationWithHours( + // Duration(seconds: _.positionSeconds.value)) + // : printDuration( + // Duration(seconds: _.positionSeconds.value)), + // style: textStyle, + // ); + // }), + // const SizedBox(width: 2), + // const Text('/', style: textStyle), + // const SizedBox(width: 2), + // Obx( + // () => Text( + // _.durationSeconds.value >= 3600 + // ? printDurationWithHours( + // Duration(seconds: _.durationSeconds.value)) + // : printDuration( + // Duration(seconds: _.durationSeconds.value)), + // style: textStyle, + // ), + // ), + // const Spacer(), + // // 倍速 + // // Obx( + // // () => SizedBox( + // // width: 45, + // // height: 34, + // // child: TextButton( + // // style: ButtonStyle( + // // padding: MaterialStateProperty.all(EdgeInsets.zero), + // // ), + // // onPressed: () { + // // _.togglePlaybackSpeed(); + // // }, + // // child: Text( + // // '${_.playbackSpeed.toString()}X', + // // style: textStyle, + // // ), + // // ), + // // ), + // // ), + // SizedBox( + // height: 30, + // child: TextButton( + // onPressed: () => _.toggleVideoFit(), + // style: ButtonStyle( + // padding: MaterialStateProperty.all(EdgeInsets.zero), + // ), + // child: Obx( + // () => Text( + // _.videoFitDEsc.value, + // style: const TextStyle(color: Colors.white, fontSize: 13), + // ), + // ), + // ), + // ), + // const SizedBox(width: 10), + // // 全屏 + // Obx( + // () => ComBtn( + // icon: Icon( + // _.isFullScreen.value + // ? FontAwesomeIcons.compress + // : FontAwesomeIcons.expand, + // size: 15, + // color: Colors.white, + // ), + // fuc: () => triggerFullScreen!(), + // ), + // ), + // ], + // ), const SizedBox(height: 12), ], ),