提交 51ab5a3d authored 作者: 祁增奎's avatar 祁增奎

增加防抖功能

上级 06453845
......@@ -17,6 +17,7 @@ export 'widgets/input_widget/code_input_view.dart';
export 'widgets/tips_widget/no_receive_resend_sms_view.dart';
export 'widgets/tips_widget/no_receive_sms_view.dart';
export 'widgets/tips_widget/no_receive_voice_view.dart';
export 'widgets/button/clx_interval_button.dart';
/// -------公共Utils---------
export 'utils/line_code_manage_config.dart';
......
......@@ -52,7 +52,7 @@ class CLXLineCodeManageView extends StatelessWidget {
Obx(
() => Visibility(
visible: loigc.codeSendBtn.value.isNotEmpty,
child: GestureDetector(
child: CLXIntervalBtn(
onTap: loigc.sendSmsCode,
child: Text(
loigc.codeSendBtn.value,
......
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
class CLXIntervalBtn extends StatelessWidget with WidgetInterval {
CLXIntervalBtn(
{super.key,
required this.child,
interval = const Duration(seconds: 1),
this.disabled = false,
this.onTap});
final Widget? child;
final bool disabled;
final Function? onTap;
@override
Widget build(BuildContext context) {
return GestureDetector(
key: key,
onTap: _onTap,
child: child,
);
}
void _onTap() {
if (disabled) {
return;
}
if (lastTap == null ||
lastTap?.add(interval).compareTo(DateTime.now()) == -1) {
lastTap = DateTime.now();
onTap?.call();
}
}
}
class CLXTapGestureRecognizer extends TapGestureRecognizer
with TapGestureRecognizerInterval {
@protected
@override
void handleTapUp(
{required PointerDownEvent down, required PointerUpEvent up}) {
final TapUpDetails details = TapUpDetails(
kind: up.kind,
globalPosition: up.position,
localPosition: up.localPosition,
);
final canTouch = lastTap == null ||
lastTap?.add(interval).compareTo(DateTime.now()) == -1;
if (!canTouch) {
return;
}
lastTap = DateTime.now();
switch (down.buttons) {
case kPrimaryButton:
if (onTapUp != null) {
invokeCallback<void>('onTapUp', () => onTapUp!(details));
}
if (onTap != null) {
invokeCallback<void>('onTap', onTap!);
}
case kSecondaryButton:
if (onSecondaryTapUp != null) {
invokeCallback<void>(
'onSecondaryTapUp', () => onSecondaryTapUp!(details));
}
if (onSecondaryTap != null) {
invokeCallback<void>('onSecondaryTap', () => onSecondaryTap!());
}
case kTertiaryButton:
if (onTertiaryTapUp != null) {
invokeCallback<void>(
'onTertiaryTapUp', () => onTertiaryTapUp!(details));
}
default:
}
}
}
mixin WidgetInterval on Widget {
Duration get interval => _interval;
Duration _interval = Duration.zero;
DateTime? lastTap;
set interval(Duration duration) {
_interval = duration;
}
}
mixin TapGestureRecognizerInterval on TapGestureRecognizer {
Duration get interval => _interval;
Duration _interval = const Duration(seconds: 1);
DateTime? lastTap;
set interval(Duration duration) {
_interval = duration;
}
}
import 'package:clx_verification_code/clx_verification_code.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
......@@ -33,7 +34,7 @@ class NoReceiveResendSmsView extends StatelessWidget {
TextSpan(
text: '获取语音验证码',
style: reSendStyle,
recognizer: TapGestureRecognizer()..onTap = sendVoiceCode,
recognizer: CLXTapGestureRecognizer()..onTap = sendVoiceCode,
),
],
),
......
import 'package:clx_verification_code/clx_verification_code.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
......@@ -43,13 +44,13 @@ class NoReceiveSmsView extends StatelessWidget {
TextSpan(
text: '重新获取',
style: reSendStyle,
recognizer: TapGestureRecognizer()..onTap = sendSmsCode,
recognizer: CLXTapGestureRecognizer()..onTap = sendSmsCode,
),
],
),
),
const Spacer(),
GestureDetector(
CLXIntervalBtn(
onTap: sendVoiceCode,
child: Text(
'获取语音验证码',
......
import 'package:clx_verification_code/clx_verification_code.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
......@@ -47,7 +48,7 @@ class NoReceiveVoiceView extends StatelessWidget {
TextSpan(
text: '重新获取',
style: reSendStyle,
recognizer: TapGestureRecognizer()..onTap = sendVoiceCode,
recognizer: CLXTapGestureRecognizer()..onTap = sendVoiceCode,
),
],
),
......@@ -55,7 +56,7 @@ class NoReceiveVoiceView extends StatelessWidget {
),
if (isShowContact) ...[
const SizedBox(width: 10),
GestureDetector(
CLXIntervalBtn(
onTap: contactService,
child: Text(
'联系人工服务',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论