lib/utils/vibration_util.dart (39 lines of code) (raw):

// Copyright © 2025 Alibaba Cloud. All rights reserved. // // Author: keria // Date: 2025/2/11 // Brief: 提供了用于控制设备振动的方法 import 'package:flutter/services.dart'; import 'dart:async'; import 'log_util.dart'; /// 震动工具类 /// /// 提供了用于控制设备振动的方法,例如振动控制 /// /// If you think the HapticFeedback vibration effect provided by Flutter native is not awesome, /// we recommend you use the vibration third-party library to achieve it. class VibrationUtil { /// 默认振动时长(毫秒) static const int defaultVibrationDuration = 500; /// 最小防抖间隔(毫秒) static const int defaultMinVibrationInterval = 300; /// 上次振动时间,用于防抖机制 static DateTime? _lastVibrationTime; // 私有构造函数,防止实例化 VibrationUtil._(); /// 根据指定时长触发设备振动反馈 /// /// [duration] 振动时长(单位:毫秒),默认值为 [defaultVibrationDuration] static void vibrate({int duration = defaultVibrationDuration}) async { try { final now = DateTime.now(); // 防抖机制:控制两次振动之间的最小间隔 if (_lastVibrationTime == null || now.difference(_lastVibrationTime!) >= const Duration(milliseconds: defaultMinVibrationInterval)) { // 使用 HapticFeedback 模拟振动 await _performHapticFeedback(duration); _lastVibrationTime = now; } } catch (e) { loge("Failed to execute haptic feedback: $e"); } } /// 执行 HapticFeedback 振动操作 /// /// [duration] 振动时长(单位:毫秒) static Future<void> _performHapticFeedback(int duration) async { // 计算需要触发的振动次数 final int vibrationCount = (duration / 100).ceil(); // 每次振动约 100 毫秒 for (int i = 0; i < vibrationCount; i++) { await HapticFeedback.heavyImpact(); await Future.delayed(const Duration(milliseconds: 100)); // 控制振动间隔 } } /// 边界振动反馈,带有防抖机制 /// /// [value] 边界值,当值小于等于 0.0 或大于等于 1.0 时触发振动 static void vibrateOnEdge(double value) { final now = DateTime.now(); // 防抖机制:控制两次振动之间的最小间隔 if ((_lastVibrationTime == null || now.difference(_lastVibrationTime!) >= const Duration(milliseconds: defaultMinVibrationInterval)) && (value <= 0.0 || value >= 1.0)) { HapticFeedback.heavyImpact(); _lastVibrationTime = now; } } }