並べ替えグリッド Reorderable 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