Flutter Shake依赖包无法工作,出现SensorManager相关日志
问题描述
运行代码时输出以下日志:
D/SensorManager( 2702): unregisterListener :: D/SensorManager( 2702): registerListener :: 0, BMA254 Acceleration Sensor, 200000, 0,
但摇一摇功能未触发,代码如下:
import 'package:flutter/material.dart'; import 'package:shake/shake.dart'; class DemoPage extends StatefulWidget { @override _DemoPageState createState() => _DemoPageState(); } class _DemoPageState extends State<DemoPage> { @override void initState() { super.initState(); ShakeDetector detector = ShakeDetector.autoStart( onPhoneShake: () { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Shake!'), ), ); print('shake'); // Do stuff on phone shake }, minimumShakeCount: 1, shakeSlopTimeMS: 500, shakeCountResetTime: 3000, shakeThresholdGravity: 2.7, ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('demo'), ), ); } }
排查与解决
核心问题:ShakeDetector实例被垃圾回收
你在initState里创建的ShakeDetector是局部变量,方法执行完毕后,这个实例会被Dart的垃圾回收机制清理,导致传感器监听直接失效,自然触发不了摇一摇回调。
修复步骤
- 把
ShakeDetector定义为State类的成员变量,避免被回收:
class _DemoPageState extends State<DemoPage> { // 定义成员变量存储检测器实例 late ShakeDetector detector; @override void initState() { super.initState(); // 初始化检测器 detector = ShakeDetector.autoStart( onPhoneShake: () { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Shake!'), ), ); print('shake'); }, minimumShakeCount: 1, shakeSlopTimeMS: 500, shakeCountResetTime: 3000, shakeThresholdGravity: 2.7, ); }
- 可选:添加页面销毁时的资源释放(避免内存泄漏)
重写dispose方法,手动停止传感器监听:
@override void dispose() { detector.stopListening(); super.dispose(); }
其他排查方向
- 调整灵敏度阈值:如果设备摇动感度低,
shakeThresholdGravity设为2.7可能偏高,可以尝试调低到1.5-2.0测试。 - 确认测试环境:必须用真实设备测试,模拟器的摇一摇模拟大概率无法被传感器正确识别。
内容的提问来源于stack exchange,提问作者You Matter
相关产品推荐
相关产品推荐

