mod: common slide page

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-05 10:44:49 +08:00
parent 9c21f03df8
commit 6497fb6cd0
11 changed files with 133 additions and 153 deletions

View File

@@ -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<IntroDetail> createState() => _IntroDetailState();
}
class _IntroDetailState extends CommonSlidePageState<IntroDetail> {
late bool _isInit = true;
class _IntroDetailState extends CommonCollapseSlidePageState<IntroDetail> {
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(

View File

@@ -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<T extends CommonCollapseSlidePage>
extends CommonSlidePageState<T> {
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);
}
}

View File

@@ -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!

View File

@@ -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<PostPanel> createState() => _PostPanelState();
}
class _PostPanelState extends CommonSlidePageState<PostPanel> {
late bool _isInit = true;
class _PostPanelState extends CommonCollapseSlidePageState<PostPanel> {
VideoDetailController get videoDetailController =>
widget.videoDetailController;
PlPlayerController get plPlayerController => widget.plPlayerController;
List<PostSegmentModel>? 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,

View File

@@ -368,7 +368,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
}
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<VideoDetailPage>
],
),
onPressed: () {
videoDetailController.backToHome = true;
videoDetailController
.plPlayerController.backToHome = true;
Get.until((route) => route.isFirst);
},
),

View File

@@ -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<ViewPointsPage> createState() => _ViewPointsPageState();
}
class _ViewPointsPageState extends CommonSlidePageState<ViewPointsPage> {
late bool _isInit = true;
class _ViewPointsPageState
extends CommonCollapseSlidePageState<ViewPointsPage> {
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,

View File

@@ -406,7 +406,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
}
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<VideoDetailPageV>
),
onPressed: () {
videoDetailController
.plPlayerController
.backToHome = true;
Get.until((route) =>
route.isFirst);
@@ -844,6 +845,69 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
],
),
),
if (videoDetailController.playedTime ==
null)
Align(
alignment: Alignment.centerRight,
child: PopupMenuButton<String>(
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) =>
<PopupMenuEntry<String>>[
const PopupMenuItem<String>(
value: 'later',
child: Text('稍后再看'),
),
if (videoDetailController
.epId ==
null)
const PopupMenuItem<String>(
value: 'note',
child: Text('查看笔记'),
),
const PopupMenuItem<String>(
value: 'report',
child: Text('举报'),
),
],
),
),
],
),
),
@@ -1359,7 +1423,8 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
],
),
onPressed: () {
videoDetailController.backToHome = true;
videoDetailController
.plPlayerController.backToHome = true;
Get.until((route) => route.isFirst);
},
),

View File

@@ -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<AiDetail> createState() => _AiDetailState();
}
class _AiDetailState extends CommonSlidePageState<AiDetail> {
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<AiDetail> {
InlineSpan buildContent(BuildContext context, content) {
List descV2 = content.descV2;
// type

View File

@@ -1799,7 +1799,7 @@ class _HeaderControlState extends State<HeaderControl> {
color: Colors.white,
),
onPressed: () {
widget.videoDetailCtr.backToHome = true;
widget.videoDetailCtr.plPlayerController.backToHome = true;
Get.until((route) => route.isFirst);
},
),

View File

@@ -354,6 +354,8 @@ class PlPlayerController {
_playCallBack = playCallBack;
}
bool? backToHome;
static Function? _playCallBack;
static Future<void> playIfExists(

View File

@@ -82,6 +82,8 @@ class WbiSign {
return mixinKey;
}
final resp = await Request().get(Api.userInfo);
if (resp.data['code'] == 0) {
final wbiUrls = resp.data['data']['wbi_img'];
mixinKey = getMixinKey(
@@ -89,7 +91,9 @@ class WbiSign {
localCache.put(LocalCacheKey.mixinKey, mixinKey);
localCache.put(LocalCacheKey.timeStamp, nowDate.millisecondsSinceEpoch);
return mixinKey;
}
return mixinKey ?? '';
}
static Future<Map<String, dynamic>> makSign(