Flutter摇动手势识别插件shake_gesture的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter摇动手势识别插件shake_gesture的使用

shake_gesture 是一个用于检测 Android 和 iOS 上摇动手势的 Flutter 插件。该插件没有任何依赖项,并且可以在模拟器上正常工作。

使用方法

声明式(Imperatively)

void main() {
  void myCallback() {}

  // 注册回调函数
  ShakeGesture.registerCallback(onShake: myCallback);

  // 在dispose函数中,不要忘记清理
  ShakeGesture.unregisterCallback(onShake: myCallback);
}

组件(Widget)

在Flutter应用中,可以通过 ShakeGesture 组件来监听摇动手势。下面是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:shake_gesture/shake_gesture.dart';
import 'package:shake_gesture_test_helper/shake_gesture_test_helper.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key}) : super();

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(home: HomePage());
  }
}

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('ShakeGesture Example')),
      body: Center(
        child: ShakeGesture(
          onShake: () {
            ScaffoldMessenger.of(context).showSnackBar(
              const SnackBar(content: Text('Shake!')),
            );
          },
          child: const Center(
            child: OutlinedButton(
              onPressed: ShakeGestureTestHelperExtension.simulateShake,
              child: Text('Simulate Shake'),
            ),
          ),
        ),
      ),
    );
  }
}

在这个例子中,当用户摇动设备时,会弹出一个Snackbar提示“Shake!”。此外,还有一个按钮可以模拟摇动事件,方便在没有物理设备的情况下进行测试。

模拟器支持

这个包可以在iOS模拟器中正常工作。对于Android模拟器,你可以通过以下两种方式之一来模拟摇动事件:

  1. 使用传感器管理器:调整模拟器中的传感器设置。
  2. 修改Activity代码:添加如下代码到你的Activity中,然后使用快捷键(如Ctrl+M或Cmd+M)来模拟摇动。
import android.view.KeyEvent
import dev.fluttercommunity.shake_gesture_android.ShakeGesturePlugin

class MainActivity: FlutterActivity() {

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_MENU) {
            this.flutterEngine?.plugins?.get(ShakeGesturePlugin::class.java).let { plugin ->
                if (plugin is ShakeGesturePlugin)
                    plugin.onShake()
            }
        }

        return super.onKeyDown(keyCode, event)
    }

}

测试助手

为了在测试中模拟摇动手势,可以添加 shake_gesture_test_helper 包,并调用 widgetTester.shake() 方法:

testWidgets('it detects shakes', (widgetTester) async {
  var shakeDetected = false;
  await widgetTester.pumpWidget(
    ShakeGesture(
      onShake: () {
        shakeDetected = true;
      },
      child: Container(),
    ),
  );
  await widgetTester.shake();
  expect(shakeDetected, true);
});

自定义摇动手势

  • iOS: 目前无法自定义iOS上的摇动手势,因为它依赖于Apple SDK中的 motionShake
  • Android: 可以通过在 AndroidManifest.xml 文件中添加元数据来自定义所需的摇动强度和次数。例如:
<manifest ...>
    <application ...>
        <meta-data
            android:name="dev.fluttercommunity.shake_gesture_android.SHAKE_FORCE"
            android:value="4" />
        <meta-data
            android:name="dev.fluttercommunity.shake_gesture_android.MIN_NUM_SHAKES"
            android:value="3" />
    </application>
</manifest>

默认情况下,摇动强度为6牛顿,最少需要6次摇动。

贡献

如果你想要为这个项目做出贡献,请运行单元测试和集成测试以确保一切正常:

cd shake_gesture/example
flutter test
flutter test integration_test

希望这些信息能够帮助你更好地理解和使用 shake_gesture 插件!如果有任何问题,欢迎随时提问。


更多关于Flutter摇动手势识别插件shake_gesture的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter摇动手势识别插件shake_gesture的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用shake_gesture插件来识别摇动手势的代码示例。这个示例展示了如何设置插件并处理摇动手势事件。

首先,确保你的Flutter项目已经添加了shake_gesture依赖。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  shake_gesture: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以按照以下步骤来使用shake_gesture插件:

  1. 导入插件

在你的Dart文件中导入shake_gesture插件。

import 'package:shake_gesture/shake_gesture.dart';
  1. 设置ShakeGestureDetector

在你的主组件(通常是MyAppMyHomePage)中使用ShakeGestureDetector来监听摇动手势。

import 'package:flutter/material.dart';
import 'package:shake_gesture/shake_gesture.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Shake Gesture Demo'),
      ),
      body: Center(
        child: ShakeGestureDetector(
          onShake: () {
            // 摇动手势触发时执行的代码
            showDialog(
              context: context,
              builder: (context) => AlertDialog(
                title: Text('Shake Detected'),
                content: Text('You shook your device!'),
                actions: <Widget>[
                  TextButton(
                    onPressed: () => Navigator.of(context).pop(),
                    child: Text('OK'),
                  ),
                ],
              ),
            );
          },
          child: Text('Shake your device!'),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个ShakeGestureDetector组件。当用户摇动设备时,会触发onShake回调,显示一个对话框提示“You shook your device!”。

  1. 运行应用

确保你的设备或模拟器已经连接,然后运行flutter run来启动应用。摇动设备以测试摇动手势识别功能。

这个示例展示了如何在Flutter应用中使用shake_gesture插件来识别和处理摇动手势。你可以根据自己的需求在onShake回调中添加更多的逻辑来处理摇动手势事件。

回到顶部