From 6497fb6cd041e953b371ed23215188d4fa2332d4 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Wed, 5 Mar 2025 10:44:49 +0800 Subject: [PATCH] mod: common slide page Signed-off-by: bggRGjQaUbCoE --- .../introduction/widgets/intro_detail.dart | 38 +--------- .../common/common_collapse_slide_page.dart | 37 ++++++++++ lib/pages/video/detail/controller.dart | 2 - .../video/detail/post_panel/post_panel.dart | 37 +--------- lib/pages/video/detail/view.dart | 5 +- .../detail/view_point/view_points_page.dart | 39 ++--------- lib/pages/video/detail/view_v.dart | 69 ++++++++++++++++++- lib/pages/video/detail/widgets/ai_detail.dart | 39 +---------- .../video/detail/widgets/header_control.dart | 2 +- lib/plugin/pl_player/controller.dart | 2 + lib/utils/wbi_sign.dart | 16 +++-- 11 files changed, 133 insertions(+), 153 deletions(-) create mode 100644 lib/pages/common/common_collapse_slide_page.dart diff --git a/lib/pages/bangumi/introduction/widgets/intro_detail.dart b/lib/pages/bangumi/introduction/widgets/intro_detail.dart index 0f29c03a..70dbe83d 100644 --- a/lib/pages/bangumi/introduction/widgets/intro_detail.dart +++ b/lib/pages/bangumi/introduction/widgets/intro_detail.dart @@ -1,6 +1,5 @@ -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; -import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter/material.dart'; import 'package:PiliPlus/common/widgets/stat/danmu.dart'; import 'package:PiliPlus/common/widgets/stat/view.dart'; @@ -8,7 +7,7 @@ import 'package:get/get.dart'; import '../../../../utils/utils.dart'; -class IntroDetail extends CommonSlidePage { +class IntroDetail extends CommonCollapseSlidePage { final dynamic bangumiDetail; final dynamic videoTags; @@ -22,43 +21,12 @@ class IntroDetail extends CommonSlidePage { State createState() => _IntroDetailState(); } -class _IntroDetailState extends CommonSlidePageState { - late bool _isInit = true; +class _IntroDetailState extends CommonCollapseSlidePageState { late final TextStyle smallTitle = TextStyle( fontSize: 12, color: Theme.of(context).colorScheme.onSurface, ); - @override - void initState() { - super.initState(); - if (enableSlide && GStorage.collapsibleVideoPage) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() { - _isInit = false; - }); - } - }); - } - } - - @override - Widget build(BuildContext context) { - if (enableSlide && GStorage.collapsibleVideoPage && _isInit) { - return CustomScrollView( - physics: const NeverScrollableScrollPhysics(), - ); - } - - return enableSlide - ? Padding( - padding: EdgeInsets.only(top: padding), - child: buildPage, - ) - : buildPage; - } - @override Widget get buildPage { return Material( diff --git a/lib/pages/common/common_collapse_slide_page.dart b/lib/pages/common/common_collapse_slide_page.dart new file mode 100644 index 00000000..1c002b27 --- /dev/null +++ b/lib/pages/common/common_collapse_slide_page.dart @@ -0,0 +1,37 @@ +import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/utils/storage.dart'; +import 'package:flutter/material.dart'; + +abstract class CommonCollapseSlidePage extends CommonSlidePage { + const CommonCollapseSlidePage({super.key, super.enableSlide}); +} + +abstract class CommonCollapseSlidePageState + extends CommonSlidePageState { + late bool _isInit = true; + + @override + void initState() { + super.initState(); + if (enableSlide && GStorage.collapsibleVideoPage) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + setState(() { + _isInit = false; + }); + } + }); + } + } + + @override + Widget build(BuildContext context) { + if (enableSlide && GStorage.collapsibleVideoPage && _isInit) { + return CustomScrollView( + physics: const NeverScrollableScrollPhysics(), + ); + } + + return super.build(context); + } +} diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 140a76d0..b5a0a58f 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -141,8 +141,6 @@ class VideoDetailController extends GetxController max(max(Get.height, Get.width) * 0.65, min(Get.height, Get.width)); late double videoHeight = minVideoHeight; - bool? backToHome; - void setVideoHeight() { String direction = firstVideo.width != null && firstVideo.height != null ? firstVideo.width! > firstVideo.height! diff --git a/lib/pages/video/detail/post_panel/post_panel.dart b/lib/pages/video/detail/post_panel/post_panel.dart index 9d24b8de..d15320cd 100644 --- a/lib/pages/video/detail/post_panel/post_panel.dart +++ b/lib/pages/video/detail/post_panel/post_panel.dart @@ -9,7 +9,7 @@ import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/models/common/sponsor_block/action_type.dart'; import 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart'; import 'package:PiliPlus/models/common/sponsor_block/segment_type.dart'; -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/video/detail/index.dart'; import 'package:PiliPlus/plugin/pl_player/index.dart'; import 'package:PiliPlus/utils/extension.dart'; @@ -21,7 +21,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -class PostPanel extends CommonSlidePage { +class PostPanel extends CommonCollapseSlidePage { const PostPanel({ super.key, super.enableSlide, @@ -36,43 +36,12 @@ class PostPanel extends CommonSlidePage { State createState() => _PostPanelState(); } -class _PostPanelState extends CommonSlidePageState { - late bool _isInit = true; +class _PostPanelState extends CommonCollapseSlidePageState { VideoDetailController get videoDetailController => widget.videoDetailController; PlPlayerController get plPlayerController => widget.plPlayerController; List? get list => videoDetailController.list; - @override - void initState() { - super.initState(); - if (enableSlide && GStorage.collapsibleVideoPage) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() { - _isInit = false; - }); - } - }); - } - } - - @override - Widget build(BuildContext context) { - if (enableSlide && GStorage.collapsibleVideoPage && _isInit) { - return CustomScrollView( - physics: const NeverScrollableScrollPhysics(), - ); - } - - return enableSlide - ? Padding( - padding: EdgeInsets.only(top: padding), - child: buildPage, - ) - : buildPage; - } - @override Widget get buildPage => Scaffold( resizeToAvoidBottomInset: false, diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index acc1d676..0d70b240 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -368,7 +368,7 @@ class _VideoDetailPageState extends State } shutdownTimerService.handleWaitingFinished(); // _bufferedListener?.cancel(); - if (videoDetailController.backToHome != true) { + if (videoDetailController.plPlayerController.backToHome != true) { videoPlayerServiceHandler.onVideoDetailDispose(heroTag); } if (plPlayerController != null) { @@ -1067,7 +1067,8 @@ class _VideoDetailPageState extends State ], ), onPressed: () { - videoDetailController.backToHome = true; + videoDetailController + .plPlayerController.backToHome = true; Get.until((route) => route.isFirst); }, ), diff --git a/lib/pages/video/detail/view_point/view_points_page.dart b/lib/pages/video/detail/view_point/view_points_page.dart index 0f227796..b0df8094 100644 --- a/lib/pages/video/detail/view_point/view_points_page.dart +++ b/lib/pages/video/detail/view_point/view_points_page.dart @@ -2,15 +2,14 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/icon_button.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/segment_progress_bar.dart'; -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/video/detail/index.dart'; import 'package:PiliPlus/plugin/pl_player/index.dart'; -import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class ViewPointsPage extends CommonSlidePage { +class ViewPointsPage extends CommonCollapseSlidePage { const ViewPointsPage({ super.key, super.enableSlide, @@ -25,44 +24,14 @@ class ViewPointsPage extends CommonSlidePage { State createState() => _ViewPointsPageState(); } -class _ViewPointsPageState extends CommonSlidePageState { - late bool _isInit = true; +class _ViewPointsPageState + extends CommonCollapseSlidePageState { VideoDetailController get videoDetailController => widget.videoDetailController; PlPlayerController? get plPlayerController => widget.plPlayerController; - @override - void initState() { - super.initState(); - if (enableSlide && GStorage.collapsibleVideoPage) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() { - _isInit = false; - }); - } - }); - } - } - int currentIndex = -1; - @override - Widget build(BuildContext context) { - if (enableSlide && GStorage.collapsibleVideoPage && _isInit) { - return CustomScrollView( - physics: const NeverScrollableScrollPhysics(), - ); - } - - return enableSlide - ? Padding( - padding: EdgeInsets.only(top: padding), - child: buildPage, - ) - : buildPage; - } - @override Widget get buildPage => Scaffold( resizeToAvoidBottomInset: false, diff --git a/lib/pages/video/detail/view_v.dart b/lib/pages/video/detail/view_v.dart index 2fef92e5..433daa60 100644 --- a/lib/pages/video/detail/view_v.dart +++ b/lib/pages/video/detail/view_v.dart @@ -406,7 +406,7 @@ class _VideoDetailPageVState extends State } shutdownTimerService.handleWaitingFinished(); // _bufferedListener?.cancel(); - if (videoDetailController.backToHome != true) { + if (videoDetailController.plPlayerController.backToHome != true) { videoPlayerServiceHandler.onVideoDetailDispose(heroTag); } if (plPlayerController != null) { @@ -814,6 +814,7 @@ class _VideoDetailPageVState extends State ), onPressed: () { videoDetailController + .plPlayerController .backToHome = true; Get.until((route) => route.isFirst); @@ -844,6 +845,69 @@ class _VideoDetailPageVState extends State ], ), ), + if (videoDetailController.playedTime == + null) + Align( + alignment: Alignment.centerRight, + child: PopupMenuButton( + icon: Icon( + Icons.more_vert, + color: Theme.of(context) + .colorScheme + .onSurface, + ), + onSelected: (String type) async { + switch (type) { + case 'later': + var res = await UserHttp + .toViewLater( + bvid: + videoDetailController + .bvid); + SmartDialog.showToast( + res['msg']); + break; + case 'report': + if (videoDetailController + .userInfo == + null) { + SmartDialog.showToast( + '账号未登录'); + } else { + Get.toNamed('/webview', + parameters: { + 'url': + 'https://www.bilibili.com/appeal/?avid=${IdUtils.bv2av(videoDetailController.bvid)}&bvid=${videoDetailController.bvid}' + }); + } + break; + case 'note': + videoDetailController + .showNoteList(context); + break; + } + }, + itemBuilder: + (BuildContext context) => + >[ + const PopupMenuItem( + value: 'later', + child: Text('稍后再看'), + ), + if (videoDetailController + .epId == + null) + const PopupMenuItem( + value: 'note', + child: Text('查看笔记'), + ), + const PopupMenuItem( + value: 'report', + child: Text('举报'), + ), + ], + ), + ), ], ), ), @@ -1359,7 +1423,8 @@ class _VideoDetailPageVState extends State ], ), onPressed: () { - videoDetailController.backToHome = true; + videoDetailController + .plPlayerController.backToHome = true; Get.until((route) => route.isFirst); }, ), diff --git a/lib/pages/video/detail/widgets/ai_detail.dart b/lib/pages/video/detail/widgets/ai_detail.dart index 597b1100..db1ddae3 100644 --- a/lib/pages/video/detail/widgets/ai_detail.dart +++ b/lib/pages/video/detail/widgets/ai_detail.dart @@ -1,7 +1,6 @@ import 'package:PiliPlus/common/constants.dart'; -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/video/detail/controller.dart'; -import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -9,7 +8,7 @@ import 'package:get/get.dart'; import 'package:PiliPlus/models/video/ai.dart'; import 'package:PiliPlus/utils/utils.dart'; -class AiDetail extends CommonSlidePage { +class AiDetail extends CommonCollapseSlidePage { final ModelResult modelResult; const AiDetail({ @@ -21,39 +20,7 @@ class AiDetail extends CommonSlidePage { State createState() => _AiDetailState(); } -class _AiDetailState extends CommonSlidePageState { - late bool _isInit = true; - - @override - void initState() { - super.initState(); - if (enableSlide && GStorage.collapsibleVideoPage) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() { - _isInit = false; - }); - } - }); - } - } - - @override - Widget build(BuildContext context) { - if (enableSlide && GStorage.collapsibleVideoPage && _isInit) { - return CustomScrollView( - physics: const NeverScrollableScrollPhysics(), - ); - } - - return enableSlide - ? Padding( - padding: EdgeInsets.only(top: padding), - child: buildPage, - ) - : buildPage; - } - +class _AiDetailState extends CommonCollapseSlidePageState { InlineSpan buildContent(BuildContext context, content) { List descV2 = content.descV2; // type diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index ef212492..7b12dffa 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -1799,7 +1799,7 @@ class _HeaderControlState extends State { color: Colors.white, ), onPressed: () { - widget.videoDetailCtr.backToHome = true; + widget.videoDetailCtr.plPlayerController.backToHome = true; Get.until((route) => route.isFirst); }, ), diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 01f46c78..ea518179 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -354,6 +354,8 @@ class PlPlayerController { _playCallBack = playCallBack; } + bool? backToHome; + static Function? _playCallBack; static Future playIfExists( diff --git a/lib/utils/wbi_sign.dart b/lib/utils/wbi_sign.dart index efb6eb72..65dc3d00 100644 --- a/lib/utils/wbi_sign.dart +++ b/lib/utils/wbi_sign.dart @@ -82,14 +82,18 @@ class WbiSign { return mixinKey; } final resp = await Request().get(Api.userInfo); - final wbiUrls = resp.data['data']['wbi_img']; - mixinKey = getMixinKey( - getFileName(wbiUrls['img_url']) + getFileName(wbiUrls['sub_url'])); + if (resp.data['code'] == 0) { + final wbiUrls = resp.data['data']['wbi_img']; - localCache.put(LocalCacheKey.mixinKey, mixinKey); - localCache.put(LocalCacheKey.timeStamp, nowDate.millisecondsSinceEpoch); - return mixinKey; + mixinKey = getMixinKey( + getFileName(wbiUrls['img_url']) + getFileName(wbiUrls['sub_url'])); + + localCache.put(LocalCacheKey.mixinKey, mixinKey); + localCache.put(LocalCacheKey.timeStamp, nowDate.millisecondsSinceEpoch); + } + + return mixinKey ?? ''; } static Future> makSign(