diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart index 62842075d..583be7d9a 100644 --- a/lib/pages/bangumi/introduction/view.dart +++ b/lib/pages/bangumi/introduction/view.dart @@ -121,7 +121,16 @@ class _BangumiInfoState extends State { late final BangumiInfoModel? bangumiItem; late double sheetHeight; int? cid; - + bool isProcessing = false; + VoidCallback handleState(Future Function() action) { + return () async { + if (!isProcessing) { + setState(() => isProcessing = true); + await action(); + setState(() => isProcessing = false); + } + }; + } @override void initState() { super.initState(); @@ -395,7 +404,7 @@ class _BangumiInfoState extends State { () => ActionItem( icon: const Icon(FontAwesomeIcons.thumbsUp), selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp), - onTap: () => bangumiIntroController.actionLikeVideo(), + onTap: handleState(bangumiIntroController.actionLikeVideo), selectStatus: bangumiIntroController.hasLike.value, loadingStatus: false, text: !widget.loadingStatus @@ -406,7 +415,7 @@ class _BangumiInfoState extends State { () => ActionItem( icon: const Icon(FontAwesomeIcons.b), selectIcon: const Icon(FontAwesomeIcons.b), - onTap: () => bangumiIntroController.actionCoinVideo(), + onTap: handleState(bangumiIntroController.actionCoinVideo), selectStatus: bangumiIntroController.hasCoin.value, loadingStatus: false, text: !widget.loadingStatus @@ -455,7 +464,7 @@ class _BangumiInfoState extends State { Obx( () => ActionRowItem( icon: const Icon(FontAwesomeIcons.thumbsUp), - onTap: () => videoIntroController.actionLikeVideo(), + onTap: handleState(videoIntroController.actionLikeVideo), selectStatus: videoIntroController.hasLike.value, loadingStatus: widget.loadingStatus, text: !widget.loadingStatus @@ -467,7 +476,7 @@ class _BangumiInfoState extends State { Obx( () => ActionRowItem( icon: const Icon(FontAwesomeIcons.b), - onTap: () => videoIntroController.actionCoinVideo(), + onTap: handleState(videoIntroController.actionCoinVideo), selectStatus: videoIntroController.hasCoin.value, loadingStatus: widget.loadingStatus, text: !widget.loadingStatus diff --git a/lib/pages/dynamics/widgets/action_panel.dart b/lib/pages/dynamics/widgets/action_panel.dart index 53c9e497e..46ab7202e 100644 --- a/lib/pages/dynamics/widgets/action_panel.dart +++ b/lib/pages/dynamics/widgets/action_panel.dart @@ -23,7 +23,16 @@ class ActionPanel extends StatefulWidget { class _ActionPanelState extends State { final DynamicsController _dynamicsController = Get.put(DynamicsController()); late ModuleStatModel stat; - + bool isProcessing = false; + VoidCallback handleState(Future Function() action) { + return () async { + if (!isProcessing) { + setState(() => isProcessing = true); + await action(); + setState(() => isProcessing = false); + } + }; + } @override void initState() { super.initState(); @@ -31,7 +40,7 @@ class _ActionPanelState extends State { } // 动态点赞 - onLikeDynamic() async { + Future onLikeDynamic() async { feedBack(); var item = widget.item!; String dynamicId = item.idStr!; @@ -101,7 +110,7 @@ class _ActionPanelState extends State { Expanded( flex: 1, child: TextButton.icon( - onPressed: () => onLikeDynamic(), + onPressed: handleState(onLikeDynamic), icon: Icon( stat.like!.status! ? FontAwesomeIcons.solidThumbsUp diff --git a/lib/pages/video/detail/introduction/view.dart b/lib/pages/video/detail/introduction/view.dart index 98ce9ba8d..424ac509a 100644 --- a/lib/pages/video/detail/introduction/view.dart +++ b/lib/pages/video/detail/introduction/view.dart @@ -134,7 +134,16 @@ class _VideoInfoState extends State with TickerProviderStateMixin { late int mid; late String memberHeroTag; late bool enableAi; - + bool isProcessing = false; + VoidCallback handleState(Future Function() action) { + return () async { + if (!isProcessing) { + setState(() => isProcessing = true); + await action(); + setState(() => isProcessing = false); + } + }; + } @override void initState() { super.initState(); @@ -477,7 +486,7 @@ class _VideoInfoState extends State with TickerProviderStateMixin { () => ActionItem( icon: const Icon(FontAwesomeIcons.thumbsUp), selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp), - onTap: () => videoIntroController.actionLikeVideo(), + onTap: handleState(videoIntroController.actionLikeVideo), selectStatus: videoIntroController.hasLike.value, loadingStatus: loadingStatus, text: !loadingStatus @@ -494,7 +503,7 @@ class _VideoInfoState extends State with TickerProviderStateMixin { () => ActionItem( icon: const Icon(FontAwesomeIcons.b), selectIcon: const Icon(FontAwesomeIcons.b), - onTap: () => videoIntroController.actionCoinVideo(), + onTap: handleState(videoIntroController.actionCoinVideo), selectStatus: videoIntroController.hasCoin.value, loadingStatus: loadingStatus, text: !loadingStatus @@ -538,7 +547,7 @@ class _VideoInfoState extends State with TickerProviderStateMixin { Obx( () => ActionRowItem( icon: const Icon(FontAwesomeIcons.thumbsUp), - onTap: () => videoIntroController.actionLikeVideo(), + onTap: handleState(videoIntroController.actionLikeVideo), selectStatus: videoIntroController.hasLike.value, loadingStatus: loadingStatus, text: @@ -549,7 +558,7 @@ class _VideoInfoState extends State with TickerProviderStateMixin { Obx( () => ActionRowItem( icon: const Icon(FontAwesomeIcons.b), - onTap: () => videoIntroController.actionCoinVideo(), + onTap: handleState(videoIntroController.actionCoinVideo), selectStatus: videoIntroController.hasCoin.value, loadingStatus: loadingStatus, text: diff --git a/lib/pages/video/detail/reply/widgets/zan.dart b/lib/pages/video/detail/reply/widgets/zan.dart index c628904fe..6ce732ddc 100644 --- a/lib/pages/video/detail/reply/widgets/zan.dart +++ b/lib/pages/video/detail/reply/widgets/zan.dart @@ -22,7 +22,7 @@ class ZanButton extends StatefulWidget { class _ZanButtonState extends State { // 评论点赞 - onLikeReply() async { + Future onLikeReply() async { feedBack(); // SmartDialog.showLoading(msg: 'pilipala ...'); ReplyItemModel replyItem = widget.replyItem!; @@ -47,6 +47,16 @@ class _ZanButtonState extends State { SmartDialog.showToast(res['msg']); } } + bool isProcessing = false; + VoidCallback handleState(Future Function() action) { + return () async { + if (!isProcessing) { + setState(() => isProcessing = true); + await action(); + setState(() => isProcessing = false); + } + }; + } @override Widget build(BuildContext context) { @@ -55,6 +65,7 @@ class _ZanButtonState extends State { return SizedBox( height: 32, child: TextButton( + onPressed: handleState(onLikeReply), child: Row( children: [ Icon( @@ -79,7 +90,6 @@ class _ZanButtonState extends State { ), ], ), - onPressed: () => onLikeReply(), ), ); }