You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:20:31