Flutter/Dart

リストをスライドしてアクションを実行するボタンを表示する

flutter_slidableを利用する

  • pubspec.yamlに記載して、プラグインを追加する

    version: 0.0.1+1
    
    environment:
      sdk: ">=2.2.0 <3.0.0"
    
      dependencies:
        flutter:
          sdk: flutter
      flutter_slidable: ^0.5.4
    
  • Widgetを作成する

    return ReorderableListView(
      children: List.generate(
        _list_.length,
        (index) {
          return Slidable(
            key: ValueKey('$index'),
            dismissal: SlidableDismissal(
              child: SlidableDrawerDismissal(),
              dismissThresholds: <SlideActionType, double>{
                // 右dismissal(スワイプ)をキャンセルする(1.0にセットする)
                SlideActionType.secondary: 1.0
              },
              onDismissed: (actionType) async {
                await _removeSiteContents(index);
              },
            ),
            actions: <Widget>[
              IconSlideAction(
                caption: 'Edit',
                color: Colors.blue,
                icon: Icons.edit,
                onTap: () {},
              ),
            ],
            secondaryActions: <Widget>[
              IconSlideAction(
                caption: 'Delete',
                color: Colors.red,
                icon: Icons.delete,
                onTap: () async => await _removeSiteContents(index),
              )
            ],
            child: Container(),
            actionPane: SlidableDrawerActionPane(),
          );
        },
      ),
    );
    

備考

Dismissibleと似ているが、Dismissibleはスライドして要素削除

Dismissibleの場合

return ReorderableListView(
  children: List.generate(
    _list_.length,
    (index) {
      return Dismissible(
        key: ValueKey('$index'),
        background: Container(
          color: Theme.of(context).errorColor,
          alignment: Alignment.centerLeft,
          padding: const EdgeInsets.all(16.0),
          child: const Icon(
            Icons.restore_from_trash,
          ),
        ),
        secondaryBackground: Container(
          color: Theme.of(context).errorColor,
          alignment: Alignment.centerRight,
          padding: const EdgeInsets.all(16.0),
          child: Icon(Icons.restore_from_trash),
        ),
        onDismissed: (direction) {
          // directionに応じて処理を変える
          // 右スワイプか左スワイプ
        },
        child: Container(),
      );
    },
  ),
);

参考URL

https://webbibouroku.com/Blog/Article/flutter-list-item-delete