振って元に戻す Shake to Undo
端末を振ると「入力を取り消しますか?」と聞かれ、直前の操作を元に戻せる。iPhone の昔からの操作。
本物の Flutter ウィジェットが動きます(初回は数秒かかります)
どんなもの?
iPhone の標準アプリで使える「シェイクで取り消し」です。ボタンを探さなくても戻せますが、知らない人も多い操作です。
Flutter では自動では起きないので、sensors_plus の userAccelerometerEventStream()(重力を除いた加速度)を監視し、
一定以上の強さの揺れを短い間に何度か検知したら「振った」とみなして確認ダイアログを出します。
Web ではセンサーで振れないため、このデモはボタンで「振った」ことにして動きを再現しています。
知られていない操作なので、取り消しボタンなど目に見える手段も必ず用意します。
こんなときに
- 入力系のアプリで、ボタンとは別の取り消し手段を用意したい(特に iOS 向け)
避けたい場面
- 取り消しの手段がシェイクしかない(気づかれない。歩きながらで誤作動もする)
最小コード
// pubspec.yaml: sensors_plus
userAccelerometerEventStream().listen((e) {
final force = sqrt(e.x * e.x + e.y * e.y + e.z * e.z);
if (force > 15) {
// 短い間に何度か強い揺れが来たら「振った」とみなす
onShake();
}
});
Future<void> onShake() async {
final undo = await showCupertinoDialog<bool>(
context: context,
builder: (context) => const CupertinoAlertDialog(title: Text('入力を取り消しますか?'), ...),
);
if (undo == true) undoLast();
}使うウィジェット
CupertinoAlertDialog
パッケージ: sensors_plus ↗