triple_tap_detector.dart 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import 'package:flutter/material.dart';
  2. /// 三击检测器
  3. class TripleTapDetector extends StatefulWidget {
  4. final Widget child;
  5. final VoidCallback onTripleTap;
  6. final int requiredTaps;
  7. final Duration tapInterval;
  8. const TripleTapDetector({
  9. super.key,
  10. required this.child,
  11. required this.onTripleTap,
  12. this.requiredTaps = 5,
  13. this.tapInterval = const Duration(milliseconds: 500),
  14. });
  15. @override
  16. State<TripleTapDetector> createState() => _TripleTapDetectorState();
  17. }
  18. class _TripleTapDetectorState extends State<TripleTapDetector> {
  19. int _tapCount = 0;
  20. DateTime? _lastTapTime;
  21. void _handleTap() {
  22. final now = DateTime.now();
  23. if (_lastTapTime == null) {
  24. _tapCount = 1;
  25. } else {
  26. // 检查点击间隔是否在指定时间内
  27. if (now.difference(_lastTapTime!) <= widget.tapInterval) {
  28. _tapCount++;
  29. } else {
  30. _tapCount = 1;
  31. }
  32. }
  33. _lastTapTime = now;
  34. // 达到指定点击次数时触发回调
  35. if (_tapCount == widget.requiredTaps) {
  36. widget.onTripleTap();
  37. _tapCount = 0;
  38. _lastTapTime = null;
  39. }
  40. }
  41. @override
  42. Widget build(BuildContext context) {
  43. return Listener(
  44. onPointerDown: (event) {
  45. _handleTap();
  46. },
  47. behavior: HitTestBehavior.translucent,
  48. child: widget.child,
  49. );
  50. }
  51. }