Flutter设备震动iOS插件

时间:2018-06-17 20:57:23

标签: ios swift plugins flutter flutter-plugin

晚上的人,

我正在研究为Flutter构建插件,以检测设备是否在抖动。现在我已经找到了如何在Swift(Detect shake gesture IOS Swift)中进行技术操作,但我仍然坚持如何将其作为Flutter插件连接起来,因为我无法直接访问视图控制器生命周期事件

需要一种方法来挂钩

  • viewDidLoad中
  • canBecomeFirstResponder
  • motionEnded

有人能把我推向正确的方向吗?

3 个答案:

答案 0 :(得分:2)

Flutter Team 已发布a plugin called sensors,可用于检测来自加速度计(和陀螺仪)的动作。

import 'package:sensors/sensors.dart';

accelerometerEvents.listen((AccelerometerEvent event) {
  // "calculate" "shakes" here
});

event包含xyz值。将此与时间相结合可以检查是否有震动。

我只是指出这一点,因为从头开始创建 完整插件 的方式要少得多。

答案 1 :(得分:2)

我遇到了同样的问题,所以我发现Reactive ProgrammingRxDart可以提供帮助。

您可以创建一个名为BLoC的{​​{1}}(业务逻辑组件):

sensor_bloc.dart

然后,只需在您的小部件中订阅其事件: 在您的状态下声明 import 'dart:async'; import 'dart:math'; import 'package:rxdart/rxdart.dart'; import 'package:sensors/sensors.dart'; class SensorBloc { StreamSubscription<dynamic> _accelerometerStream; //INPUT final _thresholdController = StreamController<int>(); Sink<int> get threshold => _thresholdController.sink; // OUTPUT final _shakeDetector = StreamController<bool>(); Stream<bool> get shakeEvent => _shakeDetector.stream.transform(ThrottleStreamTransformer(Duration(seconds: 2))); SensorBloc() { const CircularBufferSize = 10; double detectionThreshold = 70.0; List<double> circularBuffer = List.filled(CircularBufferSize,0.0); int index = 0; double minX=0.0, maxX=0.0; _thresholdController.stream.listen((value){ // safety if (value > 30) detectionThreshold = value*1.0; }); _accelerometerStream = accelerometerEvents.listen((AccelerometerEvent event){ index = (index == CircularBufferSize -1 ) ? 0: index+1; var oldX = circularBuffer[index]; if (oldX == maxX) { maxX = circularBuffer.reduce(max); } if (oldX == minX) { minX = circularBuffer.reduce(min); } circularBuffer[index] = event.x; if (event.x < minX ) minX=event.x; if (event.x> maxX) maxX = event.x; if (maxX-minX>detectionThreshold) { _shakeDetector.add(true); circularBuffer.fillRange(0, CircularBufferSize, 0.0); minX=0.0; maxX=0.0; } }); } void dispose() { _shakeDetector.close(); _accelerometerStream.cancel(); _thresholdController.close(); } } ,并挂接到生命周期事件

(注意:我使用InheritedWidget,使我可以通过静态函数StreamSubscription<bool> shakeSubscriber ;访问伞式BLoC):

MainWidget.bloc(context)

答案 2 :(得分:1)

您可以尝试使用此插件:shake_event

使用起来非常简单,并且适用于iOS和Android。