Flutter实现:设置页勾选振动后扫码页扫码触发振动
完整实现方案
1. 配置依赖
确保pubspec.yaml中添加所需依赖包:
dependencies: flutter: sdk: flutter shared_preferences: ^2.2.2 vibration: ^1.7.6
执行flutter pub get完成依赖安装。
2. 实现SettingPage振动设置
创建SettingPage,通过CheckListTile绑定振动开关,将设置状态持久化到SharedPreferences:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class SettingPage extends StatefulWidget { const SettingPage({Key? key}) : super(key: key); @override State<SettingPage> createState() => _SettingPageState(); } class _SettingPageState extends State<SettingPage> { bool _vibrationEnabled = true; @override void initState() { super.initState(); _loadSavedSetting(); } // 加载已保存的振动设置 Future<void> _loadSavedSetting() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { _vibrationEnabled = prefs.getBool('vibrationEnabled') ?? true; }); } // 保存振动设置到本地 Future<void> _saveSetting(bool value) async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setBool('vibrationEnabled', value); setState(() { _vibrationEnabled = value; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('设置')), body: ListTile( title: const Text('扫码振动'), trailing: Checkbox( value: _vibrationEnabled, onChanged: (value) { if (value != null) _saveSetting(value); }, ), onTap: () => _saveSetting(!_vibrationEnabled), ), ); } }
3. 修改ScannerPage的扫码逻辑
在scanQR方法中,当扫码成功(结果不为-1)时触发振动:
import 'package:flutter/material.dart'; import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:vibration/vibration.dart'; import 'package:logging/logging.dart'; final log = Logger('ScannerPage'); class ScannerPage extends StatefulWidget { final Function(bool) onBeepSettingChanged; final bool beepChecked; const ScannerPage({ Key? key, required this.onBeepSettingChanged, required this.beepChecked, }) : super(key: key); @override State<ScannerPage> createState() => _ScannerPageState(); } class _ScannerPageState extends State<ScannerPage> { List<String> selectedImages = []; String scanResult = ""; Future<void> _triggerVibration() async { SharedPreferences prefs = await SharedPreferences.getInstance(); bool isVibrationEnabled = prefs.getBool('vibrationEnabled') ?? true; if (isVibrationEnabled) { // 检查设备是否支持振动 bool hasVibrator = await Vibration.hasVibrator() ?? false; if (hasVibrator) { Vibration.vibrate(duration: 500); } } } Future<void> scanQR() async { try { final scanResult = await FlutterBarcodeScanner.scanBarcode( '#ff6666', 'Cancel', true, ScanMode.BARCODE, ); if (!mounted) return; setState(() { this.scanResult = scanResult; }); log('de_alam scanner $scanResult'); if (scanResult == "-1") { return; } // 扫码成功,触发振动 await _triggerVibration(); if (scanResult.isNotEmpty) { Navigator.push( context, MaterialPageRoute( builder: (context) => ResultPage(scanResult: scanResult), ), ); } } on PlatformException { setState(() { scanResult = "Failed to get platform version"; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('扫码')), body: Center( child: ElevatedButton( onPressed: scanQR, child: const Text('开始扫码'), ), ), ); } } // 假设ResultPage为已有页面 class ResultPage extends StatelessWidget { final String scanResult; const ResultPage({Key? key, required this.scanResult}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('扫码结果')), body: Center(child: Text(scanResult)), ); } }
核心修改说明
- 在
scanQR方法中,扫码成功且返回结果不是取消标记-1时,调用_triggerVibration触发振动 _triggerVibration方法中增加了设备振动支持检测,避免在不支持振动的设备上报错- SettingPage实现了设置的加载与持久化,确保开关状态重启后依然有效
内容的提问来源于stack exchange,提问作者Hafsa Azram
相关产品推荐
相关产品推荐

