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

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的垃圾回收机制清理,导致传感器监听直接失效,自然触发不了摇一摇回调。

修复步骤

  1. 把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,
    );
  }
  1. 可选:添加页面销毁时的资源释放(避免内存泄漏)
    重写dispose方法,手动停止传感器监听:
@override
void dispose() {
  detector.stopListening();
  super.dispose();
}

其他排查方向

  • 调整灵敏度阈值:如果设备摇动感度低,shakeThresholdGravity设为2.7可能偏高,可以尝试调低到1.5-2.0测试。
  • 确认测试环境:必须用真实设备测试,模拟器的摇一摇模拟大概率无法被传感器正确识别。

内容的提问来源于stack exchange,提问作者You Matter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:09:56