本文翻译自: 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 。
},
),
),
);