[译]Flutter Favorite 之强大的可滑动列表组件 flutter_slidable - 常见问题 & 迁移

1,138 阅读3分钟

本文翻译自: FAQ · letsar/flutter_slidable Wiki (github.com)


常见问题

如何在点击后阻止 SlidableAction 关闭?

CustomSlidableAction 和 SlidableAction 组件有一个 autoClose 的构造方法参数,默认值是 true 。如果不想操作窗格自动关闭,可以将 autoClose 的值设置为 false

如何在列表滑动后阻止 Slidable 关闭?

默认情况下,Slidable 会在最邻近的 Scrollable 组件开始滚动时关闭。 要阻止该情况,可以传递 false 给它的 closeOnScroll 构造方法参数。

如何消除 Slidable

默认情况下,Slidable 不是可消除的。要使其可消除,需要给某一个  ActionPane 的构造方法参数 dismissible 设置一个 DismissiblePane

Slidable(
  // 如果在使用 dismissible ,必须要设置 key 。
  key: ValueKey(item),

  // 可以选择哪个操作空格如何响应消除。
  startActionPane: ActionPane(

    // 可消除 Slidable 的窗格。
    dismissible: DismissiblePane(onDismissed: () {}),
  )
),

如何阻止消除一个滑块而不是另外的?

只对(可消除目标的)操作窗格设置 dismissible,而不设置其它的。

如何让用户取消一个消除操作?

可为可消除操作设置 confirmDismiss 回调方法来表示对话框,如果用户想确认操作时可让用户在该对话框决定。

如何保持只有一个 Slidable 处于打开状态?

需要为属于同一个组所有的 Slidable 设置相同的 groupTag 值,并为 Slidable 添加一个 SlidableAutoCloseBehavior 动作。

在下面的代码片段中,前两个 Slidable 有相同的组,所有只有其中一个能被打开,最后一个 Slidable 和这两个是独立的。

SlidableAutoCloseBehavior(
  child: ListView(
    children: [
      Slidable(
        groupTag: '0',
      ),
      Slidable(
        groupTag: '0',
      ),
      Slidable(
        groupTag: '1',
      ),
    ],
  ),
)

如何通过编码打开 Slidable ?

可以在 Slidable 的 child 中获取 SlidableController 。该控制器可用于编码(如调用openEndActionPane()openStartActionPane())打开关闭着的 Slidable 。

从版本 0.6.0 迁移到版本 1.0.0

从版本 0.6.0 到版本 1.0.0 有很多破坏性的变化。该文档用于识别出这些变化并帮助用户迁移代码。

Action (操作)

在 0.6 中,可以使用 IconSlideAction 展示一个带有图标和标签的操作。
在 1.0 中,该组件叫做 SlideAction

0.6

IconSlideAction(
  caption: 'Archive',
  color: Colors.blue,
  icon: Icons.archive,
  onTap: () {},
);

1.0

SlidableAction(
  label: 'Archive',
  backgroundColor: Colors.blue,
  icon: Icons.archive,
  onPressed: (context) {},
);

Action Pane (操作窗格)

在 0.6 中,首要和次要的操作窗格共享相同的属性,它们使用同样的动画和扩展率。
虽然这样设置起来简单,但是不能对应所有的用法。
1.0 修正了这一点,解除了两者之间的绑定。

0.6

在 0.6 中会如下编写:

Slidable(
  actionPane: SlidableDrawerActionPane(),
  actionExtentRatio: 0.25,
  child: const MyWidget(),
  actions: <Widget>[
    IconSlideAction(
      caption: 'Archive',
      color: Colors.blue,
      icon: Icons.archive,
      onTap: () {},
    ),
  ],
  secondaryActions: <Widget>[
    IconSlideAction(
      caption: 'Delete',
      color: Colors.red,
      icon: Icons.delete,
      onTap: () {},
    ),
  ],
);

1.0

同样的组件在 1.0 版本中会如下编写:

Slidable(
  startActionPane: ActionPane(
    motion: const DrawerMotion(),
    extentRatio: 0.25,
    children: [
      SlidableAction(
        label: 'Archive',
        backgroundColor: Colors.blue,
        icon: Icons.archive,
        onPressed: (context) {},
      ),
    ],
  ),
  endActionPane: ActionPane(
    motion: const DrawerMotion(),
    extentRatio: 0.25,
    children: [
      SlidableAction(
        label: 'Delete',
        backgroundColor: Colors.red,
        icon: Icons.delete,
        onPressed: (context) {},
      ),
    ],
  ),
  child: const MyWidget(),
);

Motion (运动)

在 0.6 中,操作类型定义了动画行为。
在 1.0 中,行为通过 motion 控制。
下面是一个概览表:

ActionPaneMotion
SlidableBehindActionPaneBehindMotion
SlidableScrollActionPaneScrollMotion
SlidableDrawerActionPaneDrawerMotion
SlidableStrechActionPaneStretchMotion

Dismissible (可消除组件)

在 0.6 中,Slidable 的可消除成员处理 Slidable 可被移除的方式。
现在,在 1.0 中,需要为 dismissible 设置一个 DismissiblePane 以使它们有相同的动作。

0.6

Slidable(
  key: ValueKey(0), // key 是必需的。
  dismissal: SlidableDismissal(
    child: SlidableDrawerDismissal(),
    onDismissed: (actionType) {
      // 从组件树里移除该 Slidable 。
    },
  ),
);

1.0

Slidable(
  key: ValueKey(0), // key 是必需的。
  startActionPane: ActionPane(
    dismissible: DismissiblePane(
      onDismissed: () {
      // 从组件树里移除该 Slidable 。
      },
    ),
  ),
);