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

長押しで確定 Hold to Confirm

ボタンを押し続けると色が溜まっていき、端まで溜まると実行される。途中で離すと溜めた分が抜ける。

別名
ホールドボタン押し続けて確定長押しボタン溜めて実行Press and HoldLong Press Button
動き
押し続けると溜まる端まで溜まると実行離すと抜ける
作り方
自作 標準ウィジェットの組み合わせで自分で作ります

本物の Flutter ウィジェットが動きます(初回は数秒かかります)

別タブで大きく開く ↗

どんなもの?

削除やリセットなど取り消せない操作を、うっかり押しても実行されないようにする形です。

ゲームの「長押しでスキップ」もこの仲間です。

onTapDown で AnimationController を forward、onTapUp と onTapCancel で reverse し、

完了(AnimationStatus.completed)したら実行します。

溜まり具合は FractionallySizedBox の widthFactor にアニメーションの値を渡して見せます。

こんなときに

  • 削除・リセットなど、確認ダイアログを出すほどではないが誤操作は防ぎたい

避けたい場面

  • よく使う普通の操作(毎回待たされて煩わしい)

最小コード

GestureDetector(
  onTapDown: (_) => hold.forward(),   // 押している間、溜まる
  onTapUp: (_) => hold.reverse(),     // 途中で離すと抜ける
  onTapCancel: () => hold.reverse(),
  child: AnimatedBuilder(
    animation: hold,
    builder: (context, _) => Stack(children: [
      FractionallySizedBox(
        widthFactor: hold.value,
        child: const ColoredBox(color: Colors.red),
      ),
      const Center(child: Text('長押しで削除')),
    ]),
  ),
)
// hold.addStatusListener((s) { if (s == AnimationStatus.completed) delete(); });

使うウィジェット

GestureDetector(onTapDown/onTapUp)AnimationControllerFractionallySizedBox

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

触ってみる ↗
ボタン スライドして確定Slide to Confirm

丸いつまみを右端まで指で滑らせると確定する。押し間違いが起きない、重い操作用のボタン。

つまみを右へ動かす
触ってみる ↗
ボタン ローディングボタンLoading Button

押すとボタンが丸く縮んで中でくるくる回り、終わるとチェックマークに変わる。二度押しも防げる。

押すと丸く縮む