add interact action throttle

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-05-21 12:37:42 +08:00
parent 5795122510
commit 3b6d0179ca
2 changed files with 56 additions and 34 deletions

View File

@@ -3,6 +3,7 @@ import 'package:PiliPlus/pages/dynamics_repost/view.dart';
import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/num_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@@ -34,19 +35,23 @@ class ActionPanel extends StatelessWidget {
child: Builder( child: Builder(
builder: (context) { builder: (context) {
return TextButton.icon( return TextButton.icon(
onPressed: () => showModalBottomSheet( onPressed: () => EasyThrottle.throttle(
context: context, 'interactAction',
isScrollControlled: true, const Duration(milliseconds: 200),
useSafeArea: true, () => showModalBottomSheet(
builder: (_) => RepostPanel( context: context,
item: item, isScrollControlled: true,
onSuccess: () { useSafeArea: true,
int count = forward.count ?? 0; builder: (_) => RepostPanel(
forward.count = count + 1; item: item,
if (context.mounted) { onSuccess: () {
(context as Element?)?.markNeedsBuild(); int count = forward.count ?? 0;
} forward.count = count + 1;
}, if (context.mounted) {
(context as Element?)?.markNeedsBuild();
}
},
),
), ),
), ),
icon: Icon( icon: Icon(
@@ -67,7 +72,11 @@ class ActionPanel extends StatelessWidget {
), ),
Expanded( Expanded(
child: TextButton.icon( child: TextButton.icon(
onPressed: () => PageUtils.pushDynDetail(item, isPush: true), onPressed: () => EasyThrottle.throttle(
'interactAction',
const Duration(milliseconds: 200),
() => PageUtils.pushDynDetail(item, isPush: true),
),
icon: Icon( icon: Icon(
FontAwesomeIcons.comment, FontAwesomeIcons.comment,
size: 16, size: 16,
@@ -92,14 +101,18 @@ class ActionPanel extends StatelessWidget {
semanticLabel: like.status! ? "已赞" : "点赞", semanticLabel: like.status! ? "已赞" : "点赞",
); );
return TextButton.icon( return TextButton.icon(
onPressed: () => RequestUtils.onLikeDynamic( onPressed: () => EasyThrottle.throttle(
item, 'interactAction',
likeIcon.color == primary, const Duration(milliseconds: 200),
() { () => RequestUtils.onLikeDynamic(
if (context.mounted) { item,
(context as Element?)?.markNeedsBuild(); likeIcon.color == primary,
} () {
}, if (context.mounted) {
(context as Element?)?.markNeedsBuild();
}
},
),
), ),
icon: likeIcon, icon: likeIcon,
style: btnStyle, style: btnStyle,

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo; show ReplyInfo;
import 'package:PiliPlus/http/reply.dart'; import 'package:PiliPlus/http/reply.dart';
import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/num_utils.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:fixnum/fixnum.dart' as $fixnum; import 'package:fixnum/fixnum.dart' as $fixnum;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -117,12 +118,16 @@ class ZanButtonGrpc extends StatelessWidget {
height: 32, height: 32,
child: TextButton( child: TextButton(
style: style, style: style,
onPressed: () => onHateReply( onPressed: () => EasyThrottle.throttle(
context, 'interactAction',
isProcessing, const Duration(milliseconds: 200),
() => isProcessing = false, () => onHateReply(
isLike: isLike, context,
isDislike: isDislike, isProcessing,
() => isProcessing = false,
isLike: isLike,
isDislike: isDislike,
),
), ),
child: Icon( child: Icon(
isDislike isDislike
@@ -138,12 +143,16 @@ class ZanButtonGrpc extends StatelessWidget {
height: 32, height: 32,
child: TextButton( child: TextButton(
style: style, style: style,
onPressed: () => onLikeReply( onPressed: () => EasyThrottle.throttle(
context, 'interactAction',
isProcessing, const Duration(milliseconds: 200),
() => isProcessing = false, () => onLikeReply(
isLike: isLike, context,
isDislike: isDislike, isProcessing,
() => isProcessing = false,
isLike: isLike,
isDislike: isDislike,
),
), ),
child: Row( child: Row(
spacing: 4, spacing: 4,