跳到主要内容

可取消控件

一个可以通过在指定的 dismiss_direction 方向上拖动来取消的控件。当在指定方向上拖动或快速滑动时,其内容会平滑地滑出视图。

示例

在线示例

可取消的列表视图条目

import flet as ft

def main(page):
page.window_height, page.window_width = 500, 400

def close_yes_dlg(e):
page.close_dialog()
dlg.data.confirm_dismiss(True)

def close_no_dlg(e):
page.close_dialog()
dlg.data.confirm_dismiss(False)

dlg = ft.AlertDialog(
modal=True,
title=ft.Text("请确认"),
content=ft.Text("您确定要删除此项目吗?"),
actions=[
ft.TextButton("是", on_click=close_yes_dlg),
ft.TextButton("否", on_click=close_no_dlg),
],
actions_alignment=ft.MainAxisAlignment.CENTER,
)

def handle_confirm_dismiss(e: ft.DismissibleDismissEvent):
if e.direction == ft.DismissDirection.END_TO_START: # 右滑删除
# 保存当前的可取消控件到对话框的数据中
dlg.data = e.control
page.show_dialog(dlg)
else: # 左滑删除
e.control.confirm_dismiss(True)

def handle_dismiss(e):
lv.controls.remove(e.control)
page.update()

def handle_update(e: ft.DismissibleUpdateEvent):
print(f"更新 - 方向: {e.direction}, 进度: {e.progress}, 达到: {e.reached}, 之前达到: {e.previous_reached}")

page.add(
lv := ft.ListView(
controls=[
ft.Dismissible(
content=ft.ListTile(title=ft.Text(f"项目 {i}")),
dismiss_direction=ft.DismissDirection.HORIZONTAL,
background=ft.Container(bgcolor=ft.colors.GREEN),
secondary_background=ft.Container(bgcolor=ft.colors.RED),
on_dismiss=handle_dismiss,
on_update=handle_update,
on_confirm_dismiss=handle_confirm_dismiss,
dismiss_thresholds={
ft.DismissDirection.END_TO_START: 0.2,
ft.DismissDirection.START_TO_END: 0.2,
},
)
for i in range(10)
],
expand=True,
)
)


ft.app(main)

属性

background

一个控件,堆叠在 content 之后。

如果 secondary_background 也被指定,那么这个控件只会在内容被向下或向右拖动时出现。

content

由可取消控件包含的子控件。

cross_axis_end_offset

指定控件被取消后沿主轴的结束偏移量。

如果给出非零值,则控件将沿着交叉方向移动,具体取决于该值是正值还是负值。

dismiss_direction

控件可以被取消的方向。使用 DismissDirection 枚举进行指定:

  • DismissDirection.NONE
  • DismissDirection.VERTICAL
  • DismissDirection.HORIZONTAL
  • DismissDirection.END_TO_START
  • DismissDirection.START_TO_END
  • DismissDirection.UP
  • DismissDirection.DOWN

dismiss_thresholds

控件被认为已取消之前必须拖动的偏移阈值。

例如:阈值为 0.4(默认值)意味着项目必须至少被拖动 40% 才能被认为已取消。

它以字典的形式指定,其中键是 DismissDirection 类型,值是阈值(介于 0.01.0 之间的小数值):

ft.Dismissible(
# ...
dismiss_thresholds={
ft.DismissDirection.VERTICAL: 0.1,
ft.DismissDirection.START_TO_END: 0.7
}
)

movement_duration

控件取消或未取消时返回原位的持续时间。

resize_duration

控件在 on_dismiss 被调用之前收缩的时间。

secondary_background

一个控件,堆叠在 content 之后,当 content 被向上或向左拖动时会显示。只有在 background 也被指定时才可以指定此属性。

事件

on_confirm_dismiss

在取消操作即将完成时给应用程序一个确认或否决的机会。在解决此待定的取消操作之前,控件不能再次被拖动。

要解决待定的取消操作,请调用 confirm_dismiss(dismiss) 方法,并传递一个表示决定的布尔值。如果为 True,则控件将被取消,否则将返回到原始位置。

请参见页面顶部的示例以了解可能的实现方式。

on_dismiss

在控件被取消后触发,完成调整大小之后。

on_resize

在控件大小变化时触发,例如在取消之前收缩时。

on_update

在控件被拖动时触发。

方法

confirm_dismiss(dismiss: bool)

解决待定的取消操作。在处理 on_confirm_dismiss 事件时调用。