update flutter_vibrate

This commit is contained in:
2026-01-13 23:09:42 -08:00
parent 2a3652d808
commit 12fb3a2089
8 changed files with 474 additions and 97 deletions
@@ -4,34 +4,60 @@ import 'src/messages.g.dart';
export 'src/messages.g.dart' show VibrateApi;
/// A set of feedback types that can be used to provide haptic feedback.
enum FeedbackType {
/// Indicates a task has completed successfully.
success,
/// Indicates a task has failed or an error occurred.
error,
/// Indicates a warning or caution.
warning,
/// Indicates a selection change (e.g., scrolling through a list).
selection,
/// Provides a heavy physical impact.
impact,
/// Provides a heavy vibration.
heavy,
/// Provides a medium vibration.
medium,
/// Provides a light vibration.
light,
}
/// A class that provides access to the device's vibration hardware.
class Vibrate {
static final VibrateApi _api = VibrateApi();
static const Duration _defaultVibrationDuration = Duration(milliseconds: 500);
/// Vibrate for 500ms on Android, and for the default time on iOS (about 500ms as well)
/// Vibrates the device for 500ms on Android, and for the default system vibration duration on iOS.
static Future<void> vibrate() async {
await _api.vibrate(500);
}
/// Whether the device can actually vibrate or not
/// Checks if the device has vibration hardware.
///
/// Returns `true` if the device can vibrate, `false` otherwise.
static Future<bool> get canVibrate async {
return _api.canVibrate();
}
/// Vibrates with [pauses] in between each vibration
/// Will always vibrate once before the first pause
/// and once after the last pause
/// Vibrates the device with a specific pattern of pauses.
///
/// The [pauses] iterable defines the duration of silence in between vibrations.
/// The pattern will always start with a vibration, followed by the first pause,
/// then another vibration, and so on, ending with a final vibration.
///
/// For example, if [pauses] is `[Duration(seconds: 1)]`, the device will:
/// 1. Vibrate (default duration)
/// 2. Wait for 1 second
/// 3. Vibrate (default duration)
static Future<void> vibrateWithPauses(Iterable<Duration> pauses) async {
for (final Duration d in pauses) {
await vibrate();
@@ -44,6 +70,10 @@ class Vibrate {
await vibrate();
}
/// Provides haptic feedback corresponding to the specified [type].
///
/// This uses the platform's native haptic feedback mechanisms (e.g., `UINotificationFeedbackGenerator` on iOS,
/// `View.performHapticFeedback` on Android).
static Future<void> feedback(FeedbackType type) async {
switch (type) {
case FeedbackType.impact:
@@ -15,7 +15,6 @@ PlatformException _createConnectionError(String channelName) {
);
}
class _PigeonCodec extends StandardMessageCodec {
const _PigeonCodec();
@override
@@ -41,9 +40,13 @@ class VibrateApi {
/// Constructor for [VibrateApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
VibrateApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
: pigeonVar_binaryMessenger = binaryMessenger,
pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
VibrateApi({
BinaryMessenger? binaryMessenger,
String messageChannelSuffix = '',
}) : pigeonVar_binaryMessenger = binaryMessenger,
pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty
? '.$messageChannelSuffix'
: '';
final BinaryMessenger? pigeonVar_binaryMessenger;
static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();
@@ -51,7 +54,8 @@ class VibrateApi {
final String pigeonVar_messageChannelSuffix;
Future<bool> canVibrate() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.canVibrate$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.canVibrate$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -78,13 +82,16 @@ class VibrateApi {
}
Future<void> vibrate(int duration) async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.vibrate$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.vibrate$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[duration]);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(
<Object?>[duration],
);
final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
throw _createConnectionError(pigeonVar_channelName);
@@ -100,7 +107,8 @@ class VibrateApi {
}
Future<void> impact() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.impact$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.impact$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -122,7 +130,8 @@ class VibrateApi {
}
Future<void> selection() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.selection$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.selection$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -144,7 +153,8 @@ class VibrateApi {
}
Future<void> success() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.success$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.success$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -166,7 +176,8 @@ class VibrateApi {
}
Future<void> warning() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.warning$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.warning$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -188,7 +199,8 @@ class VibrateApi {
}
Future<void> error() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.error$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.error$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -210,7 +222,8 @@ class VibrateApi {
}
Future<void> heavy() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.heavy$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.heavy$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -232,7 +245,8 @@ class VibrateApi {
}
Future<void> medium() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.medium$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.medium$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
@@ -254,7 +268,8 @@ class VibrateApi {
}
Future<void> light() async {
final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_vibrate.VibrateApi.light$pigeonVar_messageChannelSuffix';
final pigeonVar_channelName =
'dev.flutter.pigeon.flutter_vibrate.VibrateApi.light$pigeonVar_messageChannelSuffix';
final pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,