flutter_slidable

一个 Flutter 实现的带有方向滑动操作的可滑动列表项,可以被Dismiss。

slidable_overview

功能

  • 接受主(左/上)和次(右/下)小部件列表作为滑动操作。
  • 可以被关闭。
  • 4 个内置布局。
  • 2 个内置滑动操作小部件。
  • 1 个内置关闭动画。
  • 您可以轻松创建自定义布局和动画。
  • 如果您想要在动画期间产生特殊效果,可以使用构建器来创建滑动操作。
  • 点击滑动操作后关闭(可覆盖)。
  • 当最近的 Scrollable 开始滚动时关闭(可覆盖)。
  • 轻松禁用滑动效果的选项。

入门

在您的 flutter 项目的 pubspec.yaml 文件中,添加以下依赖项

dependencies:
  ...
  flutter_slidable: "^0.4.7"

在您的库中添加以下导入

import 'package:flutter_slidable/flutter_slidable.dart';

要开始使用 Flutter,请查看在线 文档

构造函数

您可以通过两种方式创建 Slidable

  • 调用 Slidable 构造函数并传递滑动操作列表。
  • 通过调用 Slidable.builder 构造函数并传递滑动操作构建器,如果您想在动画期间产生特殊效果。

Slidable 需要几个要素

  • 滑动操作(详情见下文)。它们可以是任何小部件。为了方便起见,此包提供了 2 个内置的侧边操作小部件。
  • 一个代理。它控制滑动菜单的布局和动画。
  • 滑动操作范围与项目范围之间的范围比。
  • 一个子项。

actions 包含当子项向下或向右拖动时出现的操作。
secondaryActions 包含当子项向上或向左拖动时出现的操作。

direction 参数可让您选择是希望操作在水平滑动(默认)还是垂直滑动时出现。

new Slidable(
  delegate: new SlidableDrawerDelegate(),
  actionExtentRatio: 0.25,
  child: new Container(
    color: Colors.white,
    child: new ListTile(
      leading: new CircleAvatar(
        backgroundColor: Colors.indigoAccent,
        child: new Text('$3'),
        foregroundColor: Colors.white,
      ),
      title: new Text('Tile n°$3'),
      subtitle: new Text('SlidableDrawerDelegate'),
    ),
  ),
  actions: <Widget>[
    new IconSlideAction(
      caption: 'Archive',
      color: Colors.blue,
      icon: Icons.archive,
      onTap: () => _showSnackBar('Archive'),
    ),
    new IconSlideAction(
      caption: 'Share',
      color: Colors.indigo,
      icon: Icons.share,
      onTap: () => _showSnackBar('Share'),
    ),
  ],
  secondaryActions: <Widget>[
    new IconSlideAction(
      caption: 'More',
      color: Colors.black45,
      icon: Icons.more_horiz,
      onTap: () => _showSnackBar('More'),
    ),
    new IconSlideAction(
      caption: 'Delete',
      color: Colors.red,
      icon: Icons.delete,
      onTap: () => _showSnackBar('Delete'),
    ),
  ],
);

内置滑动操作

此包带有 2 种滑动操作

  • SlideAction,这是最灵活的。您可以选择背景颜色或任何装饰,并且它可以接受任何小部件作为子项。
  • IconSlideAction,它需要一个图标。它可以有背景颜色并在图标下方有一个标题。

内置代理

此包带有 4 种代理

SlidableBehindDelegate

滑动操作在项目滑动时保持在项目后面。

Overview

SlidableScrollDelegate

滑动操作在项目滑动时跟随项目。

Overview

SlidableDrawerDelegate

当项目滑动时,滑动操作像抽屉一样进行动画。

Overview

SlidableStrechDelegate

项目滑动时,滑动操作会拉伸。

Overview

常见问题

如何阻止我的滑动操作在被点击后关闭?

默认情况下,SlideActionIconSlideAction 在点击时关闭。
要防止这种情况,您可以在 closeOnTap 构造函数参数中传递 false

如何阻止我的 Slidable 在我的列表滚动后关闭?

默认情况下,当最近的 Scrollable 小部件开始滚动时,Slidable 会关闭。
要防止这种情况,您可以在 closeOnScroll 构造函数参数中传递 false

如何关闭我的 Slidable?

为了使您的 Slidable 可关闭,您必须在 Slidable 构造函数中设置 slideToDismissDelegate 参数。
您可以设置任何继承 SlideToDismissDelegate 的类。目前只有一个内置的:SlideToDismissDrawerDelegate

传递给 onDismissed 回调的 actionType 会告知您哪个操作已被关闭。

Slidable 可关闭时,key 参数不能为空。

示例

slideToDismissDelegate: new SlideToDismissDrawerDelegate(
  onDismissed: (actionType) {
    _showSnackBar(
        context,
        actionType == SlideActionType.primary
            ? 'Dismiss Archive'
            : 'Dimiss Delete');
    setState(() {
      items.removeAt(index);
    });
  },
),

如何防止一侧关闭但另一侧不关闭?

如果您只想让一侧可关闭,您可以将相关阈值设置为 1.0 或更高。
例如,如果您不想关闭第一个主操作,您将在 slideToDismissDelegate 上设置以下阈值:

dismissThresholds: <SlideActionType, double>{
  SlideActionType.primary: 1.0
},

如何让用户取消关闭?

您可以通过在 slideToDismissDelegate 上设置 onWillDismiss 回调来让用户确认关闭。

示例

slideToDismissDelegate: new SlideToDismissDrawerDelegate(
  onWillDismiss: (actionType) {
          return showDialog<bool>(
            context: context,
            builder: (context) {
              return new AlertDialog(
                title: new Text('Delete'),
                content: new Text('Item will be deleted'),
                actions: <Widget>[
                  new FlatButton(
                    child: new Text('Cancel'),
                    onPressed: () => Navigator.of(context).pop(false),
                  ),
                  new FlatButton(
                    child: new Text('Ok'),
                    onPressed: () => Navigator.of(context).pop(true),
                  ),
                ],
              );
            },
          );
        },
        ...
        ),

如何只保留一个 Slidable 打开?

您必须将 Slidable 构造函数的 controller 参数设置为 SlidableController 实例。

final SlidableController slidableController = new SlidableController();
...
new Slidable(
      key: new Key(item.title),
      controller: slidableController,
      ...
      );

GitHub

https://github.com/letsar/flutter_slidable