List表示されている項目を、スワイプで削除する方法を紹介します。
Dismissibleをラップする
Listのアイテムを構成しているWidgetにDismissibleをラップします。
引数について
key
ユニークなキーを指定する必要があります。
このキーが重複してしまうと、アニメーションがおかしくなったりするみたいです。
background
アイテムをスワイプした時の背景を指定することができます。
スワイプで赤背景になるやつとかを実装できます。
background: Container(
              padding: EdgeInsets.only(
                right: 10,
              ),
              alignment: AlignmentDirectional.centerEnd,
              color: Colors.red,
              child: Icon(
                Icons.delete,
                color: Colors.white,
              ),
            ),
direction
スワイプできる方向を指定できます。
direction: DismissDirection.endToStart,
| 方向 | |
|---|---|
| DismissDirection.endToStart | 右から左 | 
| DismissDirection.startToEnd | 左から右 | 
| DismissDirection.horizontal | 右から左・左から右 | 
| DismissDirection.vertical | 下から上・上から下 | 
| DismissDirection.up | 下から上 | 
| DismissDirection.down | 上から下 | 
confirmDismiss
スワイプのアニメーションが終わったタイミングで呼ばれます。
まだWidgetが破棄されていないため、本当に処理を実行して良いか等の確認を行ったりできます。
onDismissed
スワイプでWidgetが破棄され、アニメーションが終わったタイミングで呼ばれます。
実際のデータの削除処理などはここで行うことになります。
また、どの方向にスワイプされたか取得できるため、スワイプ方向によって処理を分けることもできます。
onDismissed: (direction) {
              if (direction == DismissDirection.endToStart) {
                // 右から左にスワイプされた時
              } else {
                // それ以外
              }
            },
サンプルコード
import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter App',
      home: HomeScreen(),
    );
  }
}
class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
  List<String> _item = [
    '111',
    '222',
    '333',
    '444',
  ];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('リスト'),
      ),
      body: ListView.separated(
        separatorBuilder: (context, index) => Divider(
          height: 0.0,
        ),
        itemCount: _item.length,
        itemBuilder: (BuildContext context, int index) {
          final text = _item[index];
          return Dismissible(
            key: Key(text),
            background: Container(
              padding: EdgeInsets.only(
                right: 10,
              ),
              alignment: AlignmentDirectional.centerEnd,
              color: Colors.red,
              child: Icon(
                Icons.delete,
                color: Colors.white,
              ),
            ),
            direction: DismissDirection.endToStart,
            onDismissed: (direction) {
              // スワイプ後に実行される(削除処理などを書く)
              print('onDismissed');
            },
            child: ListTile(
              title: Text(
                text,
              ),
              onTap: () {},
            ),
          );
        },
      ),
    );
  }
}

