native_haptics_and_audio 1.0.1
native_haptics_and_audio: ^1.0.1 copied to clipboard
Ultra-low latency native haptic and audio feedback designed specifically for high-speed POS barcode scanners on iOS and Android.
native_haptics_and_audio #
A high-performance Flutter plugin delivering ultra-low latency audio and haptic feedback for POS (Point of Sale) barcode scanners.
By bypassing heavy standard audio packages and leveraging raw native hardware APIs with pre-bundled, uncompressed 16-bit PCM sounds, it guarantees instant, zero-lag physical and auditory responses on Android and iOS.
Why this package? #
Standard Flutter audio plugins rely on heavy bridge serialization and decompression, which introduces a microscopic but noticeable lag. If a cashier is scanning 50 items a minute, even a 100ms audio delay feels sluggish.
This plugin solves that by:
- Pre-loading uncompressed
.wavassets directly into native RAM (using Android'sSoundPooland iOS'sAudioServices). - Utilizing Native Hardware: Triggering raw ERM motor APIs on Android and the
UIImpactFeedbackGeneratoron iOS for perfectly crisp, mechanical haptic "ticks". - Type Safety: Using
pigeonto guarantee stable, crash-free bridge communication.
Features #
- Zero-Latency Audio: Instantly play POS-specific sounds (
scannerBeep,warningBeep,doubleWarningBeep,kaching). - Optimized Haptics: Trigger mathematically tuned POS haptic profiles (
success,warning,error). - Platform Safe: Safely swallows method calls on unsupported desktop/web platforms without crashing your cross-platform app.
- Fire-and-Forget:
playSound()andplayHaptic()return immediately — noawaitneeded in your scan loop.
Installation #
Add the dependency to your pubspec.yaml:
dependencies:
native_haptics_and_audio: ^1.0.0
Quick Start #
You only need to interact with the singleton NativeHapticsAndAudioRepository.
1. Initialization #
You must initialize the repository before playing sounds. This allows the native background threads to load the audio files into RAM. A great place to do this is in your scanner screen's initState.
import 'package:native_haptics_and_audio/native_haptics_and_audio.dart';
@override
void initState() {
super.initState();
// Pre-loads native hardware. Safe to call multiple times.
NativeHapticsAndAudioRepository.instance.initialize();
}
2. Triggering Feedback #
Trigger the ultra-low latency feedback based on your business logic:
// A successful scan
void onScanSuccess() {
NativeHapticsAndAudioRepository.instance.playSound(PosSound.scannerBeep);
NativeHapticsAndAudioRepository.instance.playHaptic(PosHaptic.success);
}
// A failed or unrecognized scan
void onScanError() {
NativeHapticsAndAudioRepository.instance.playSound(PosSound.doubleWarningBeep);
NativeHapticsAndAudioRepository.instance.playHaptic(PosHaptic.error);
}
3. Cleanup (Optional but Recommended) #
To free up native RAM, release the hardware bindings when your scanner screen is disposed.
@override
void dispose() {
NativeHapticsAndAudioRepository.instance.release();
super.dispose();
}
Platform Support #
| Platform | Status | Notes |
|---|---|---|
| Android | ✅ Supported | API 24+ (SoundPool + Vibrator) |
| iOS | ✅ Supported | iOS 13.0+ (AudioServices + UIFeedbackGenerator) |
| Web | ⚪ No-op | Calls return silently |
| macOS | ⚪ No-op | Calls return silently |
| Windows | ⚪ No-op | Calls return silently |
| Linux | ⚪ No-op | Calls return silently |
Permissions #
Android #
The plugin declares the VIBRATE permission in its own AndroidManifest.xml. No additional setup is required — it is merged automatically during your app's build.
iOS #
No special permissions are required. Audio playback uses system sounds and haptic feedback uses the standard UIFeedbackGenerator APIs.
Available Sounds #
| Enum Value | Description |
|---|---|
PosSound.scannerBeep |
Standard checkout scanner confirmation beep |
PosSound.warningBeep |
Single warning tone for attention-needed events |
PosSound.doubleWarningBeep |
Urgent double-beep for errors or duplicate scans |
PosSound.kaching |
Cash register "ka-ching" for completed transactions |
Available Haptics #
| Enum Value | Description |
|---|---|
PosHaptic.success |
Crisp, short mechanical tick — confirms a successful scan |
PosHaptic.warning |
Medium-intensity pulse — signals a non-critical warning |
PosHaptic.error |
Heavy double-buzz — signals an error or rejected scan |
Contributing #
Contributions are welcome! Please open an issue first to discuss what you would like to change.
- Fork the repo
- Create your feature branch (
git checkout -b feature/my-feature) - Run
dart analyzeanddart testbefore committing - Open a Pull Request
License #
This project is licensed under the MIT License — see the LICENSE file for details.