項目を自由に並び替えたり削除したりできるリストの作り方です。実際の動作は以下のようになります。
サンプルコード
並び替え可能なリストはクラス ReorderableListView によって作成します。削除可能なリスト項目は Dismissible を使用します。
並び替えの機能はリスト全体に適用されますが、削除の機能は項目ごとです。並び替え可能なリストである ReorderableListView の子要素として、削除可能な Dismissible なリスト項目を追加していきます。
サンプルコードを以下に記載します。
reorderable_and_dismissible_list.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
// リスト項目のデータ構造
class MyData {
String id;
String name;
int age;
MyData(this.id, this.name, this.age);
}
// リスト項目
List<MyData> dataList = <MyData>[
MyData('item1', 'A', 23),
MyData('item2', 'B', 26),
MyData('item3', 'C', 35),
MyData('item4', 'D', 42),
];
class MyList extends StatefulWidget {
MyList({Key key}) : super(key: key);
@override
MyListState createState() => MyListState();
}
class MyListState extends State<MyList> {
// リスト項目となる削除可能なウィジェットを作成
Widget buildItem(MyData item, int index) {
return Dismissible(
key: Key('${item.id}'), // 項目が特定できるよう固有の文字列をキーとする
background: Container(color: Colors.red), // スワイプしているアイテムの背景色
confirmDismiss: (direction) async {
// 削除するか確認する
return await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('確認ダイアログ'),
content: Text('本当に削除しますか?'),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.of(context).pop(false),
child: Text('CANCEL'),
),
TextButton(
onPressed: () => Navigator.of(context).pop(true),
child:
Text('DELETE', style: TextStyle(color: Colors.red))),
],
);
},
);
},
onDismissed: (direction) {
// 削除時の処理
setState(() {
dataList.remove(item);
});
},
// 各項目のレイアウト
child: ListTile(
tileColor: Theme.of(context).cardColor,
title: Text(item.name,
style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 24, height: 1.2)),
subtitle: Text('AGE: ${item.age}'),
trailing: Icon(Icons.chevron_right),
onTap: () {
print(item.name);
},
));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('削除と並び替えができるリスト'),
),
body: ReorderableListView(
onReorder: (int oldIndex, int newIndex) {
if (newIndex > oldIndex) {
// 元々下にあった要素が上にずれるため一つ分後退させる
newIndex -= 1;
}
// 並び替え処理
MyData data = dataList[oldIndex];
setState(() {
dataList.removeAt(oldIndex);
dataList.insert(newIndex, data);
});
},
padding: EdgeInsets.only(top: 4),
children: dataList
.asMap()
.map((i, item) => MapEntry(i, buildItem(item, i)))
.values
.toList()));
}
}
reorderable_and_dismissible_list.dart と名付けて保存し、runApp を行うファイル(main.dart)で読み込みます。
List である dataList に表示したい項目を追加してください。ウィジェット MyList を読み込めば、削除と並び替えが可能なリストが表示されます。
