领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

Flet交互控件:ft.AlertDialog 和 ft.SnackBar,演示密码验证

nixiaole 2025-02-15 16:51:54 知识剖析 18 ℃

一、基本概念

(一)ft.AlertDialog 是 Flet 内置的“对话框”交互控件,弹出一个对话框,等待用户输入数据,或者选择操作项目,它有“模态框”和“非模态”2中形式。

定义对话框方式很简单,代码如下:

dialog = ft.AlertDialog(
            modal=True, # modal=True 表示模态框, = False 或取消该句,表示 为非模态
            title=ft.Text("密码验证"),
            content=txt_pw,
            actions=[
                ft.TextButton("确定", on_click='fun1()' ),
                ft.TextButton("取消", on_click='fun2()'),
            ],
        )

打开和关闭对话框,代码如下:

page.open(dialog) # 打开对话框
page.close(dialog) # 关闭对话框

ft.AlertDialog 的 属性和方法,放在文末。

(二)ft.SnackBar 是Flet 内置的“消息闪现”交互控件,通常在页面底部,插入一个小横幅,显示一条信息。它通常与 ft.AlertDialog 混合使用,反馈 ft.AlertDialog 的操作结果,当然也可以妙有他用。

定义SnackBar,代码如下:

page.snack_bar = ft.SnackBar(
        content=ft.Text("密码错误!"),
)

打开和关闭SnackBar,代码如下:

page.snack_bar.open = True # 打开
# 关闭方式1:page.snack_bar.open = False
# 关闭方式2:不写任何代码。因为:SnackBar 名为“闪现消息”,短暂时候后,它会自动关闭!
page.update()

提示:关闭 SnackBar 是自动的,一般不写任何代码, 名为“闪现消息”,短暂时候后,它会自动关闭!

ft.SnackBar 的 属性和方法,放在文末。

二、应用举例

模拟场景:点击一个按钮,弹出一个对话框(对话框上,有一个密码输入框,一个“确定”按钮,一个“取消”按钮)。对话框打开后,等待用户输入密码。如果密码正确,则用 SnackBar 闪现消息,提示密码通过验证(绿色字体),则继续执行后续代码。如果密码错误,则用 SnackBar 闪现消息(红色字体),提示密码错误,程序不得向下执行。

这个功能很常用,在很多应用开发中都会用到。本例效果如下:

先上完整代码,然再通过代码,解读思路:

import flet as ft

def main(page: ft.Page):
    # 定义密码验证逻辑
    def check_password(e):
        if password_input.value == "abc123":  # 假设正确密码是 "abc123"
            page.close(dialog)  # 关闭对话框
            show_snackbar("密码通过验证!", color="green")  # 显示绿色 SnackBar
            # 继续执行后续代码
            print("继续执行后续代码...")
        else:
            page.close(dialog)  # 关闭对话框
            show_snackbar("密码错误,请重试!", color="red")  # 显示红色 SnackBar
            # 不执行后续代码

    # 显示 SnackBar 的函数
    def show_snackbar(message, color):
        page.snack_bar = ft.SnackBar(
            content=ft.Text(message, color="white"),
            bgcolor=color,
            duration=2000,  # 显示 2 秒
        )
        page.snack_bar.open = True
        page.update()

    # 创建密码输入框
    password_input = ft.TextField(
        label="请输入密码",
        password=True,  # 输入内容隐藏
        can_reveal_password=True,  # 允许显示/隐藏密码
        autofocus=True,  # 自动聚焦输入框
    )

    # 创建对话框
    dialog = ft.AlertDialog(
        modal=True,  # 模态对话框(阻止背景操作)
        title=ft.Text("请输入密码"),
        content=password_input,
        actions=[
            ft.TextButton("确定", on_click=check_password),
            ft.TextButton("取消", on_click=lambda e: page.close(dialog)),
        ],
        actions_alignment=ft.MainAxisAlignment.END,  # 按钮右对齐
    )

    # 打开对话框的函数
    def open_dialog(e):
        password_input.value = ""  # 清空输入框
        page.open(dialog)  # 打开对话框

    # 创建一个按钮,点击后打开对话框
    page.add(
        ft.ElevatedButton("打开密码对话框", on_click=open_dialog)
    )

ft.app(target=main)

功能及思路:

按钮点击打开对话框:

页面加载后,显示一个按钮 "打开密码对话框"。

点击按钮后,弹出对话框。对话框内容:包含一个密码输入框(支持显示/隐藏密码)。两个按钮:"确定" 和 "取消"。

密码验证逻辑:

如果输入密码为 "abc123",关闭对话框,显示绿色 SnackBar 提示 "密码通过验证!",并继续执行后续代码。

如果密码错误,关闭对话框,显示红色 SnackBar 提示 "密码错误,请重试!",程序停止执行后续代码。

SnackBar 提示:

绿色 SnackBar 表示密码正确。

红色 SnackBar 表示密码错误。

SnackBar 显示 2 秒后自动消失

取消按钮:

点击 "取消" 按钮,直接关闭对话框,不执行任何操作。

初始页面:

页面显示一个按钮 "打开密码对话框"。

点击按钮:

弹出对话框,显示密码输入框和两个按钮。

输入正确密码 (abc123):

对话框关闭。

页面底部弹出绿色 SnackBar,显示 "密码通过验证!"。

控制台输出 "继续执行后续代码..."。

输入错误密码:

对话框关闭。页面底部弹出红色 SnackBar,显示 "密码错误,请重试!"。

控制台无输出,程序停止执行后续代码。

点击取消:

对话框关闭,无任何提示。

关键解读:

Flet 应用程序基于事件驱动模型工作。一旦对话框被打开,主程序流程实际上就处于等待状态,等待用户与界面元素进行交互(如点击按钮)。这种模型自然地阻止了程序自动向下执行,直到用户完成必要的输入和选择。

dialog = ft.AlertDialog(
        modal=True,  # 模态对话框(阻止背景操作)
        ......

因此,通过使用 Flet 的事件驱动架构以及在事件处理函数中加入条件逻辑,可以有效地控制程序的执行流程,确保在密码验证通过之前不会执行特定的后续代码。这种方式非常适合构建需要用户交互的应用程序。

三、ft.AlertDialog 的属性及方法

(一)属性

actions

在对话框底部显示的(可选)操作集。

通常这是一个 TextButton 控件列表。

action_button_padding

围绕在 actions 中每个按钮的填充。 值的类型为 PaddingValue 。

actions_alignment

定义操作的水平布局。

值的类型为MainAxisAlignment,默认值为MainAxisAlignment.END。

actions_padding

围绕在对话框底部操作集的填充。

通常用于提供按钮栏与对话框边缘之间的填充。

如果没有操作,则不包括任何填充。按钮栏周围的填充默认为零。

值的类型为PaddingValue 。

adaptive

如果值为 True,则根据目标平台是 iOS/macOS 创建自适应 AlertDialog。

在 iOS 和 macOS 上,创建 CupertinoAlertDialog,它具有与 AlertDialog 匹配的功能和表现,并且具有 iOS 上预期的图形。在其他平台上,创建材料设计 AlertDialog。

查看使用示例 此处。

值的类型为 bool ,默认值为 False 。

barrier_color(“障碍颜色”)

对话框下方使所有内容变暗的模态屏障的颜色。

如果为None,则使用DialogTheme.barrier_color。如果它也为None,则使用Colors.BLACK_54。

bgcolor

对话框表面的背景颜色。

clip_behavior

控制对话框内容如何剪裁(或不剪裁)到给定的 shape。 属性值是 ClipBehavior ,默认值为ClipBehavior.NONE。

默认为 NONE。

content

对话框的(可选)内容显示在对话框的中心,字体较轻。通常这是一个包含对话框Text消息的Column。

值为Control类型.

content_padding

内容周围的填充。

如果没有内容,则不会提供填充。否则,内容上方会提供 20 像素的填充以将内容与标题分开,左右和底部会提供 24 像素的填充以将内容与对话框的其他边缘分开。

值的类型为PaddingValue 。

elevation

定义对话框出现的高度(z 坐标)。 值的类型为OptionalNumber.

icon

一个显示在对话框顶部的控件。通常是一个 Icon 控件。

icon_padding

icon 周围的填充。 值的类型为PaddingValue.

inset_padding

对话框本身周围的填充。

值的类型为 PaddingValue。

默认值为 padding.symmetric(vertical=40, horizontal=24) - 对话框外部水平 40 像素,垂直 24 像素。

modal

是否可以通过点击对话框外部区域来关闭对话框。

值的类型为“布尔型”,默认值为“False”。

open

设置为 True 以显示对话框。

semantics_label

对话框的语义标签,由辅助功能框架用于在对话框打开和关闭时宣布屏幕过渡。

在 iOS 中,如果未提供此标签,将从 title 推断出一个语义标签(如果它不为空)。

str类型。

shadow_color

用于在对话框下绘制阴影的颜色,反映对话框的高度。

shape

设置对话框的形状。

类型为 OutlinedBorder ,默认值为 RoundedRectangleBorder(radius=4.0)。

默认形状是一个半径为 4.0 的 RoundedRectangleBorder。

surface_tint_color

用于在对话框背景色上作为表面色调覆盖的颜色,反映对话框的高度。

title

对话框的(可选)标题,以大字体显示在对话框顶部。

通常是一个 Text 控件。

title_padding

标题周围的填充。

如果没有标题,则不会提供填充。否则,将使用此填充。

值的类型为 PaddingValue。

默认在标题的顶部、左侧和右侧提供 24 个像素。如果 content 不为 None,则不提供底部填充(但请参阅 content_padding)。 如果未设置,则会额外添加 20 个像素的底部填充,以将标题与操作分开。

(二)事件

on_dismiss

对话框关闭时触发。

四、ft.SnackBar 的属性及方法

(一)属性

action

一个可选的操作,用户可以根据SnackBar采取。

例如,SnackBar可能会让用户撤销导致SnackBar出现的操作。SnackBar最多可以有一个操作。

操作不应该是“dismiss”或“cancel”。

action_color

操作按钮的前景颜色。

action_overflow_threshold

操作的宽度溢出阈值(介于0.0和1.0之间)。默认值为0.25。

如果SnackBar的content的宽度大于这个百分比的SnackBar宽度减去操作的宽度,那么操作将出现在content下方。

在值为0.0时,操作将不会溢出到新行。

behavior

定义SnackBar在页面中的行为和位置。

定义SnackBar在页面中的位置和浮动ActionButton或NavigationBar时的调整行为。

值的类型为SnackBarBehavior,默认值为SnackBarBehavior.FIXED。

注意:

  • 如果behavior=SnackBarBehavior.FLOATING,栏的长度由width或margin定义,如果两者都指定,width优先于margin。
  • 如果behavior!=SnackBarBehavior.FLOATING,则忽略width和margin。

bgcolor

SnackBar背景颜色。

clip_behavior

根据这个选项,内容将被剪辑(或不剪辑)。属性值是ClipBehavior。

默认值是HARD_EDGE。

close_icon_color

一个可选的颜色,用于关闭图标,如果show_close_icon是True。

content

SnackBar的主要内容。通常是一个Text控件。

dismiss_direction

SnackBar可以被dismiss的方向。

属性值是DismissDirection,,默认是DOWN。

duration

SnackBar保持打开的毫秒数。默认是4000([4秒](
https://api.flutter.dev/flutter/material/SnackBar/duration.html)) when not set.

elevation

SnackBar的z坐标,控制SnackBar下方阴影的大小。

margin

SnackBar周围的空白空间。

这个属性仅在behavior是SnackBarBehavior.FLOATING时使用。不能与width同时使用。

open

设置为True以显示SnackBar。这个属性将自动设置为False,一旦SnackBar显示。

padding

SnackBar的内容和可选操作的填充量。

值是一个Padding类实例或一个数字。

shape

SnackBar的形状。

值是一个OutlinedBorder类实例。

show_close_icon

是否包括一个“关闭”图标控件。

点击图标将关闭SnackBar。

width

SnackBar的宽度。

如果宽度指定,SnackBar将在可用空间中水平居中。这个属性仅在behavior是SnackBarBehavior.FLOATING时使用。不能与margin同时使用。

(二)事件

on_action

当操作按钮被点击时触发。

on_visible

当SnackBar第一次在页面中可见时触发。

(汇报完毕,感谢收看!)

Tags:

最近发表
标签列表