From 3b6d0179ca0953ebb582e45f08f7cc5b850f5b59 Mon Sep 17 00:00:00 2001 From: dom Date: Thu, 21 May 2026 12:37:42 +0800 Subject: [PATCH] add interact action throttle Signed-off-by: dom --- lib/pages/dynamics/widgets/action_panel.dart | 57 ++++++++++++-------- lib/pages/video/reply/widgets/zan_grpc.dart | 33 +++++++----- 2 files changed, 56 insertions(+), 34 deletions(-) diff --git a/lib/pages/dynamics/widgets/action_panel.dart b/lib/pages/dynamics/widgets/action_panel.dart index fdf420137..cbf93d5c2 100644 --- a/lib/pages/dynamics/widgets/action_panel.dart +++ b/lib/pages/dynamics/widgets/action_panel.dart @@ -3,6 +3,7 @@ import 'package:PiliPlus/pages/dynamics_repost/view.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; +import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -34,19 +35,23 @@ class ActionPanel extends StatelessWidget { child: Builder( builder: (context) { return TextButton.icon( - onPressed: () => showModalBottomSheet( - context: context, - isScrollControlled: true, - useSafeArea: true, - builder: (_) => RepostPanel( - item: item, - onSuccess: () { - int count = forward.count ?? 0; - forward.count = count + 1; - if (context.mounted) { - (context as Element?)?.markNeedsBuild(); - } - }, + onPressed: () => EasyThrottle.throttle( + 'interactAction', + const Duration(milliseconds: 200), + () => showModalBottomSheet( + context: context, + isScrollControlled: true, + useSafeArea: true, + builder: (_) => RepostPanel( + item: item, + onSuccess: () { + int count = forward.count ?? 0; + forward.count = count + 1; + if (context.mounted) { + (context as Element?)?.markNeedsBuild(); + } + }, + ), ), ), icon: Icon( @@ -67,7 +72,11 @@ class ActionPanel extends StatelessWidget { ), Expanded( child: TextButton.icon( - onPressed: () => PageUtils.pushDynDetail(item, isPush: true), + onPressed: () => EasyThrottle.throttle( + 'interactAction', + const Duration(milliseconds: 200), + () => PageUtils.pushDynDetail(item, isPush: true), + ), icon: Icon( FontAwesomeIcons.comment, size: 16, @@ -92,14 +101,18 @@ class ActionPanel extends StatelessWidget { semanticLabel: like.status! ? "已赞" : "点赞", ); return TextButton.icon( - onPressed: () => RequestUtils.onLikeDynamic( - item, - likeIcon.color == primary, - () { - if (context.mounted) { - (context as Element?)?.markNeedsBuild(); - } - }, + onPressed: () => EasyThrottle.throttle( + 'interactAction', + const Duration(milliseconds: 200), + () => RequestUtils.onLikeDynamic( + item, + likeIcon.color == primary, + () { + if (context.mounted) { + (context as Element?)?.markNeedsBuild(); + } + }, + ), ), icon: likeIcon, style: btnStyle, diff --git a/lib/pages/video/reply/widgets/zan_grpc.dart b/lib/pages/video/reply/widgets/zan_grpc.dart index c919e4bbc..cb718ff41 100644 --- a/lib/pages/video/reply/widgets/zan_grpc.dart +++ b/lib/pages/video/reply/widgets/zan_grpc.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' show ReplyInfo; import 'package:PiliPlus/http/reply.dart'; import 'package:PiliPlus/utils/num_utils.dart'; +import 'package:easy_debounce/easy_throttle.dart'; import 'package:fixnum/fixnum.dart' as $fixnum; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -117,12 +118,16 @@ class ZanButtonGrpc extends StatelessWidget { height: 32, child: TextButton( style: style, - onPressed: () => onHateReply( - context, - isProcessing, - () => isProcessing = false, - isLike: isLike, - isDislike: isDislike, + onPressed: () => EasyThrottle.throttle( + 'interactAction', + const Duration(milliseconds: 200), + () => onHateReply( + context, + isProcessing, + () => isProcessing = false, + isLike: isLike, + isDislike: isDislike, + ), ), child: Icon( isDislike @@ -138,12 +143,16 @@ class ZanButtonGrpc extends StatelessWidget { height: 32, child: TextButton( style: style, - onPressed: () => onLikeReply( - context, - isProcessing, - () => isProcessing = false, - isLike: isLike, - isDislike: isDislike, + onPressed: () => EasyThrottle.throttle( + 'interactAction', + const Duration(milliseconds: 200), + () => onLikeReply( + context, + isProcessing, + () => isProcessing = false, + isLike: isLike, + isDislike: isDislike, + ), ), child: Row( spacing: 4,