本文翻译自: 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 控制。
下面是一个概览表:
| ActionPane | Motion |
|---|---|
| SlidableBehindActionPane | BehindMotion |
| SlidableScrollActionPane | ScrollMotion |
| SlidableDrawerActionPane | DrawerMotion |
| SlidableStrechActionPane | StretchMotion |
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 。
},
),
),
);