opt action item

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-08-09 21:10:58 +08:00
parent 11c6745fd7
commit fac37e59aa
4 changed files with 104 additions and 151 deletions

View File

@@ -1,4 +1,3 @@
import 'dart:async';
import 'dart:math';
import 'package:PiliPlus/common/constants.dart';
@@ -44,25 +43,17 @@ class _PgcIntroPageState extends State<PgcIntroPage>
AutomaticKeepAliveClientMixin,
SingleTickerProviderStateMixin,
TripleAnimMixin {
late PgcIntroController pgcIntroController;
@override
late PgcIntroController introController;
late VideoDetailController videoDetailCtr;
bool isProcessing = false;
Future<void> handleState(FutureOr Function() action) async {
if (!isProcessing) {
isProcessing = true;
await action();
isProcessing = false;
}
}
@override
bool get wantKeepAlive => true;
@override
void initState() {
super.initState();
pgcIntroController = Get.put(PgcIntroController(), tag: widget.heroTag);
introController = Get.put(PgcIntroController(), tag: widget.heroTag);
videoDetailCtr = Get.find<VideoDetailController>(tag: widget.heroTag);
}
@@ -70,7 +61,7 @@ class _PgcIntroPageState extends State<PgcIntroPage>
Widget build(BuildContext context) {
super.build(context);
final ThemeData theme = Theme.of(context);
final item = pgcIntroController.pgcItem;
final item = introController.pgcItem;
final isLandscape = context.isLandscape;
Widget sliver = SliverToBoxAdapter(
child: Column(
@@ -86,22 +77,21 @@ class _PgcIntroPageState extends State<PgcIntroPage>
),
const SizedBox(height: 6),
// 点赞收藏转发 布局样式2
if (pgcIntroController.isPgc)
actionGrid(theme, item, pgcIntroController),
if (introController.isPgc) actionGrid(theme, item, introController),
// 番剧分集
if (item.episodes?.isNotEmpty == true)
PgcPanel(
heroTag: widget.heroTag,
pages: item.episodes!,
cid: videoDetailCtr.cid.value,
onChangeEpisode: pgcIntroController.onChangeEpisode,
onChangeEpisode: introController.onChangeEpisode,
showEpisodes: widget.showEpisodes,
newEp: item.newEp,
),
],
),
);
if (!pgcIntroController.isPgc) {
if (!introController.isPgc) {
sliver = SliverMainAxisGroup(
slivers: [
sliver,
@@ -181,18 +171,18 @@ class _PgcIntroPageState extends State<PgcIntroPage>
bottom: 6,
left: null,
),
if (!pgcIntroController.isPgc)
if (!introController.isPgc)
Positioned(
right: 6,
bottom: 6,
child: Obx(() {
final isFav = pgcIntroController.isFav.value;
final isFav = introController.isFav.value;
return iconButton(
context: context,
size: 28,
iconSize: 26,
tooltip: '${isFav ? '取消' : ''}收藏',
onPressed: () => pgcIntroController.onFavPugv(isFav),
onPressed: () => introController.onFavPugv(isFav),
icon: isFav ? Icons.star_rounded : Icons.star_border_rounded,
bgColor: isFav ? null : theme.colorScheme.onInverseSurface,
iconColor: isFav ? null : theme.colorScheme.onSurfaceVariant,
@@ -204,11 +194,11 @@ class _PgcIntroPageState extends State<PgcIntroPage>
}
Widget _buildInfoPanel(bool isLandscape, ThemeData theme, PgcInfoModel item) {
if (pgcIntroController.isPgc) {
if (introController.isPgc) {
Widget subBtn() => Obx(
() {
final isFollowed = pgcIntroController.isFollowed.value;
final followStatus = pgcIntroController.followStatus.value;
final isFollowed = introController.isFollowed.value;
final followStatus = introController.followStatus.value;
return FilledButton.tonal(
style: FilledButton.styleFrom(
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
@@ -228,26 +218,26 @@ class _PgcIntroPageState extends State<PgcIntroPage>
if (isFollowed) {
showPgcFollowDialog(
context: context,
type: pgcIntroController.pgcType,
type: introController.pgcType,
followStatus: followStatus,
onUpdateStatus: (followStatus) {
if (followStatus == -1) {
pgcIntroController.pgcDel();
introController.pgcDel();
} else {
pgcIntroController.pgcUpdate(
introController.pgcUpdate(
followStatus,
);
}
},
);
} else {
pgcIntroController.pgcAdd();
introController.pgcAdd();
}
},
child: Text(
isFollowed
? '${pgcIntroController.pgcType}'
: pgcIntroController.pgcType,
? '${introController.pgcType}'
: introController.pgcType,
),
);
},
@@ -309,7 +299,7 @@ class _PgcIntroPageState extends State<PgcIntroPage>
return GestureDetector(
onTap: () => widget.showIntroDetail(
item,
pgcIntroController.videoTags.value,
introController.videoTags.value,
),
behavior: HitTestBehavior.opaque,
child: SizedBox(
@@ -413,7 +403,7 @@ class _PgcIntroPageState extends State<PgcIntroPage>
Widget actionGrid(
ThemeData theme,
PgcInfoModel item,
PgcIntroController pgcIntroController,
PgcIntroController introController,
) {
return SizedBox(
height: 48,
@@ -423,9 +413,8 @@ class _PgcIntroPageState extends State<PgcIntroPage>
() => ActionItem(
icon: const Icon(FontAwesomeIcons.thumbsUp),
selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp),
onTap: () => handleState(pgcIntroController.actionLikeVideo),
onLongPress: () => handleState(pgcIntroController.actionTriple),
selectStatus: pgcIntroController.hasLike.value,
onTap: () => handleAction(introController.actionLikeVideo),
selectStatus: introController.hasLike.value,
semanticsLabel: '点赞',
text: NumUtil.numFormat(item.stat!.like),
controller: animController,
@@ -438,8 +427,8 @@ class _PgcIntroPageState extends State<PgcIntroPage>
() => ActionItem(
icon: const Icon(FontAwesomeIcons.b),
selectIcon: const Icon(FontAwesomeIcons.b),
onTap: () => handleState(pgcIntroController.actionCoinVideo),
selectStatus: pgcIntroController.hasCoin,
onTap: introController.actionCoinVideo,
selectStatus: introController.hasCoin,
semanticsLabel: '投币',
text: NumUtil.numFormat(item.stat!.coin),
controller: animController,
@@ -450,12 +439,12 @@ class _PgcIntroPageState extends State<PgcIntroPage>
() => ActionItem(
icon: const Icon(FontAwesomeIcons.star),
selectIcon: const Icon(FontAwesomeIcons.solidStar),
onTap: () => pgcIntroController.showFavBottomSheet(context),
onLongPress: () => pgcIntroController.showFavBottomSheet(
onTap: () => introController.showFavBottomSheet(context),
onLongPress: () => introController.showFavBottomSheet(
context,
isLongPress: true,
),
selectStatus: pgcIntroController.hasFav.value,
selectStatus: introController.hasFav.value,
semanticsLabel: '收藏',
text: NumUtil.numFormat(item.stat!.favorite),
controller: animController,
@@ -466,15 +455,15 @@ class _PgcIntroPageState extends State<PgcIntroPage>
() => ActionItem(
icon: const Icon(FontAwesomeIcons.clock),
selectIcon: const Icon(FontAwesomeIcons.solidClock),
onTap: () => handleState(pgcIntroController.viewLater),
selectStatus: pgcIntroController.hasLater.value,
onTap: () => handleAction(introController.viewLater),
selectStatus: introController.hasLater.value,
semanticsLabel: '再看',
text: '再看',
),
),
ActionItem(
icon: const Icon(FontAwesomeIcons.shareFromSquare),
onTap: () => pgcIntroController.actionShareVideo(context),
onTap: () => introController.actionShareVideo(context),
selectStatus: false,
semanticsLabel: '转发',
text: NumUtil.numFormat(item.stat!.share),
@@ -483,16 +472,4 @@ class _PgcIntroPageState extends State<PgcIntroPage>
),
);
}
@override
bool get hasTriple =>
pgcIntroController.hasLike.value &&
pgcIntroController.hasCoin &&
pgcIntroController.hasFav.value;
@override
void onLike() => handleState(pgcIntroController.actionLikeVideo);
@override
void onTriple() => handleState(pgcIntroController.actionTriple);
}