個人開発者が勉強がてらまとめているだけのサイトです

振って元に戻す Shake to Undo

端末を振ると「入力を取り消しますか?」と聞かれ、直前の操作を元に戻せる。iPhone の昔からの操作。

別名
シェイクで取り消し端末を振るシェイクジェスチャーShake Gesture
動き
端末を振る画面が揺れる取り消しの確認が出る
作り方
パッケージあり 標準でも作れますが、pub.dev のパッケージを使うと早いです

本物の 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 ↗

似ているもの・一緒に見たいもの