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

並べ替えグリッド Reorderable Grid

アイコンを長押ししてつかみ、ほかのアイコンの上へ運ぶと、その場で並びが入れ替わる。

別名
ホーム画面の並べ替えアイコンの並べ替えドラッグで並べ替え(グリッド)Reorderable GridViewDrag to Reorder Grid
動き
長押しでつかむ上に来ると入れ替わる離して置く
作り方
自作 標準ウィジェットの組み合わせで自分で作ります

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

別タブで大きく開く ↗

どんなもの?

スマホのホーム画面や、写真・ウィジェットの並びを自分で決めさせる操作です。

リストなら ReorderableListView がありますが、グリッド版は Flutter 本体にありません。

各マスを DragTarget にし、中身を LongPressDraggable にして、

onWillAcceptWithDetails(上に来た瞬間)で並べ替えると、離す前に結果が見えて分かりやすくなります。

長押しで始めるのは、普通のタップ(アプリを開く)やスクロールと区別するためです。

こんなときに

  • アイコン・写真・カードなど、2次元に並んだ物の順番をユーザーに決めさせたい

避けたい場面

  • 縦1列の一覧(ReorderableListView のほうが簡単)

最小コード

GridView.count(
  crossAxisCount: 4,
  children: [
    for (final (i, app) in apps.indexed)
      DragTarget<App>(
        onWillAcceptWithDetails: (d) {
          setState(() {
            apps.remove(d.data);   // 元の場所から抜いて
            apps.insert(i, d.data); // 上に来たマスへ入れる
          });
          return true;
        },
        builder: (context, candidates, rejected) => LongPressDraggable<App>(
          data: app,
          feedback: AppIcon(app),
          childWhenDragging: Opacity(opacity: 0.25, child: AppIcon(app)),
          child: AppIcon(app),
        ),
      ),
  ],
)

使うウィジェット

LongPressDraggableDragTargetGridView

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

触ってみる ↗
ジェスチャー 並べ替えリストReorderable List

行をつかんで上下にドラッグすると、他の行がよけて順番を入れ替えられるリスト。

つかんで持ち上がる
触ってみる ↗
ジェスチャー 長押しで編集モードJiggle Mode

アイコンを長押しすると全部がぷるぷる揺れ始め、−を押して消したり並べ替えたりできる。完了で止まる。

長押しで揺れ始める