diff --git a/lib/main.dart b/lib/main.dart index 4db591f6e..e629964c7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -267,6 +267,11 @@ class MyApp extends StatelessWidget { return; } + if (Get.isDialogOpen ?? Get.isBottomSheetOpen ?? false) { + Get.back(); + return; + } + final plCtr = PlPlayerController.instance; if (plCtr != null) { if (plCtr.isFullScreen.value == true) { @@ -274,10 +279,10 @@ class MyApp extends StatelessWidget { return; } - if (plCtr.isDesktopPip) { - plCtr.exitDesktopPip(); - return; - } + // if (plCtr.isDesktopPip) { + // plCtr.exitDesktopPip(); + // return; + // } } Get.back(); diff --git a/lib/pages/live_room/superchat/superchat_card.dart b/lib/pages/live_room/superchat/superchat_card.dart index a95c73c10..ee975f722 100644 --- a/lib/pages/live_room/superchat/superchat_card.dart +++ b/lib/pages/live_room/superchat/superchat_card.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/selectable_text.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -140,7 +141,7 @@ class _SuperChatCardState extends State { color: bottomColor, ), padding: const EdgeInsets.all(8), - child: SelectableText( + child: selectableText( item.message, style: TextStyle(color: Utils.parseColor(item.messageFontColor)), ), diff --git a/lib/pages/live_room/widgets/header_control.dart b/lib/pages/live_room/widgets/header_control.dart index 0d30135e5..3cf474908 100644 --- a/lib/pages/live_room/widgets/header_control.dart +++ b/lib/pages/live_room/widgets/header_control.dart @@ -118,17 +118,11 @@ class LiveHeaderControl extends StatelessWidget { plPlayerController.toggleDesktopPip(); return; } - try { - var floating = Floating(); - if ((await floating.isPipAvailable) == true) { - plPlayerController.hiddenControls(false); - floating.enable( - plPlayerController.isVertical - ? const EnableManual(aspectRatio: Rational.vertical()) - : const EnableManual(), - ); - } - } catch (_) {} + if (await Floating().isPipAvailable) { + plPlayerController + ..hiddenControls(false) + ..enterPip(); + } }, icon: const Icon( size: 18, diff --git a/lib/pages/video/member/view.dart b/lib/pages/video/member/view.dart index 64233d794..4993f80b9 100644 --- a/lib/pages/video/member/view.dart +++ b/lib/pages/video/member/view.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/skeleton/video_card_h.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/custom_sliver_persistent_header_delegate.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -16,7 +17,6 @@ import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; import 'package:PiliPlus/pages/video/member/controller.dart'; import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/utils/extension.dart'; -import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; @@ -41,11 +41,10 @@ class HorizontalMemberPage extends StatefulWidget { State createState() => _HorizontalMemberPageState(); } -class _HorizontalMemberPageState extends State - with GridMixin { +class _HorizontalMemberPageState extends State { late final HorizontalMemberPageController _controller; AccountService accountService = Get.find(); - dynamic _bvid; + late final String _bvid; @override void initState() { @@ -58,6 +57,15 @@ class _HorizontalMemberPageState extends State tag: widget.videoDetailController.heroTag, ); _bvid = widget.videoDetailController.bvid; + if (_controller.loadingState.value + case Success?> res) { + final index = res.response?.indexWhere((e) => e.bvid == _bvid) ?? -1; + if (index != -1) { + WidgetsBinding.instance.addPostFrameCallback((_) { + _controller.scrollController.jumpTo(100.0 * index + 40); + }); + } + } } @override @@ -180,32 +188,39 @@ class _HorizontalMemberPageState extends State LoadingState?> loadingState, ) { return switch (loadingState) { - Loading() => gridSkeleton, + Loading() => SliverPrototypeExtentList.builder( + itemCount: 10, + itemBuilder: (_, _) => const VideoCardHSkeleton(), + prototypeItem: const VideoCardHSkeleton(), + ), Success(:var response) => response?.isNotEmpty == true - ? SliverGrid.builder( - gridDelegate: gridDelegate, + ? SliverFixedExtentList.builder( itemBuilder: (context, index) { if (index == response.length - 1 && _controller.hasNext) { _controller.onLoadMore(); } final SpaceArchiveItem videoItem = response[index]; - return VideoCardHMemberVideo( - videoItem: videoItem, - bvid: _bvid, - onTap: () { - Get.back(); - widget.ugcIntroController.onChangeEpisode( - BaseEpisodeItem( - bvid: videoItem.bvid, - cid: videoItem.cid, - cover: videoItem.cover, - ), - ); - }, + return Padding( + padding: const EdgeInsets.only(bottom: 2), + child: VideoCardHMemberVideo( + videoItem: videoItem, + bvid: _bvid, + onTap: () { + Get.back(); + widget.ugcIntroController.onChangeEpisode( + BaseEpisodeItem( + bvid: videoItem.bvid, + cid: videoItem.cid, + cover: videoItem.cover, + ), + ); + }, + ), ); }, itemCount: response!.length, + itemExtent: 100, ) : HttpError(onReload: _controller.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index e8bfd5455..5152aeaf3 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -2158,9 +2158,8 @@ class HeaderControlState extends State { plPlayerController.toggleDesktopPip(); return; } - bool canUsePiP = await Floating().isPipAvailable; - plPlayerController.hiddenControls(false); - if (canUsePiP) { + if (await Floating().isPipAvailable) { + plPlayerController.hiddenControls(false); if (context.mounted && !videoPlayerServiceHandler!.enableBackgroundPlay) { final theme = Theme.of(context); @@ -2236,10 +2235,7 @@ class HeaderControlState extends State { await Future.delayed(const Duration(seconds: 3)); } if (!context.mounted) return; - PageUtils.enterPip( - width: widget.videoDetailCtr.firstVideo.width, - height: widget.videoDetailCtr.firstVideo.height, - ); + plPlayerController.enterPip(); } }, icon: const Icon( diff --git a/lib/pages/video/widgets/player_focus.dart b/lib/pages/video/widgets/player_focus.dart index f110386f2..66f610702 100644 --- a/lib/pages/video/widgets/player_focus.dart +++ b/lib/pages/video/widgets/player_focus.dart @@ -29,12 +29,12 @@ class PlayerFocus extends StatelessWidget { final VoidCallback onSendDanmaku; final bool Function()? canPlay; - static bool _shouldHandled(KeyEvent event) { - return event.logicalKey == LogicalKeyboardKey.tab || - event.logicalKey == LogicalKeyboardKey.arrowLeft || - event.logicalKey == LogicalKeyboardKey.arrowRight || - event.logicalKey == LogicalKeyboardKey.arrowUp || - event.logicalKey == LogicalKeyboardKey.arrowDown; + static bool _shouldHandle(LogicalKeyboardKey logicalKey) { + return logicalKey == LogicalKeyboardKey.tab || + logicalKey == LogicalKeyboardKey.arrowLeft || + logicalKey == LogicalKeyboardKey.arrowRight || + logicalKey == LogicalKeyboardKey.arrowUp || + logicalKey == LogicalKeyboardKey.arrowDown; } @override @@ -43,7 +43,7 @@ class PlayerFocus extends StatelessWidget { autofocus: true, onKeyEvent: (node, event) { final handled = _handleKey(event); - if (handled || _shouldHandled(event)) { + if (handled || _shouldHandle(event.logicalKey)) { return KeyEventResult.handled; } return KeyEventResult.ignored; diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 2d60730b2..ffa1e0318 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -304,8 +304,12 @@ class PlPlayerController { } void enterPip() { - if (Get.currentRoute.startsWith('/video')) { - PageUtils.enterPip(width: width, height: height); + if (videoController != null) { + final state = videoController!.player.state; + PageUtils.enterPip( + width: state.width ?? width, + height: state.height ?? height, + ); } } @@ -547,7 +551,8 @@ class PlPlayerController { if (Platform.isAndroid && autoPiP) { Utils.channel.setMethodCallHandler((call) async { if (call.method == 'onUserLeaveHint') { - if (playerStatus.status.value == PlayerStatus.playing) { + if (playerStatus.status.value == PlayerStatus.playing && + Get.currentRoute.startsWith('/video')) { enterPip(); } }