跳到主要内容

Flet v0.24.0 正式版公告

· 阅读需 8 分钟
Henri Ndonko
Flet Contributor and Maintainer

Flet 0.24.0 版本发布公告

我非常高兴地宣布 Flet 0.24.0 版本发布!它带来了一长串的错误修复、多项增强功能和新特性。

新控件

新属性

  • AudioRecordercancel_recording()
  • Videoon_completedon_track_changed
  • InputFilterunicodecase_sensitivedot_allmultiline
  • Geolocatoron_erroron_position_change
  • BarchartLineCharttooltip_border_sidetooltip_directiontooltip_fit_inside_horizontallytooltip_fit_inside_verticallytooltip_horizontal_offsettooltip_margintooltip_max_content_widthtooltip_paddingtooltip_rounded_radiustooltip_rotate_angle
  • Containerdecorationforeground_decorationignore_interactionsimage
  • PageViewdecorationforeground_decoration
  • CupertinoTextFieldenable_scribbleimageobscuring_characterpaddingscroll_paddingon_click
  • DataTableheading_row_alignment
  • TextFieldcounterdisabled_hint_contentoptions_fill_horizontally
  • ExpansionTilemin_tile_heightshow_trailing_icon
  • Markdownfit_contentimg_error_contentmd_style_sheetshrink_wrapsoft_line_breakon_selection_change
  • MenuItemButtonautofocusoverflow_axissemantic_label
  • Tabslabel_paddinglabel_text_stylepaddingsplash_border_radiusunselected_label_text_styleon_click
  • 还有很多新类(枚举、数据类、事件)……

增强功能

  • 打印事件时,事件的字符串输出更好了。
  • Image.filter_quality现在的默认值是FilterQuality.MEDIUM(之前是FilterQuality.LOW),对于缩小的图像来说,这是一个更好的默认值。
  • Geolocator控件得到了改进,通过新添加的on_position_change事件支持位置流。当定义了这个事件后,你将能够“监听”位置的变化。
  • AppBar.adaptive=True并且应用在苹果平台上运行时,AppBar.actions控件现在被包装在一个Row中,然后显示。在此之前,只显示AppBar.actions列表的第一项。
  • Markdown控件得到了显著改进。现在它可以显示 SVG 图像,并且可以进行更多的自定义。
  • 一个非常受欢迎的功能是能够为应用设置背景图像或渐变。在#3820中,我们使这个功能成为可能并且易于使用。
  • rtl(从右到左)属性已添加到更多控件(NavigationRailDestinationNavigationRailAppBarCupertinoAppBarNavigationDrawer)中,以提高对从右到左文本方向的支持。
  • 引入了--no-rich-output标志(目前仅在flet build命令中),使得可以在控制台中禁用丰富输出(主要是表情符号)。更多信息请参见#3708
  • 类型提示得到了显著改进,特别是对于事件处理程序属性。在像 PyCharm 和 VSCode 这样的现代 IDE 中,你现在可以通过将鼠标悬停在控件中的事件上轻松确定事件处理程序参数的类型。此外,当你尝试访问事件处理程序参数上不存在的属性时,IDE 会突出显示错误,确保代码更加健壮且无错误。

错误修复

以下问题已成功修复:

  • #3769:当输入无效字符时,InputFilter会清除TextField的文本内容。
  • #3770Theme.floating_action_button_theme不存在。
  • #3734:确保Dropdown.alignment被正确应用。
  • #3730:在 Windows 上打包时引发UnicodeEncodeError
  • #2160Markdown控件无法渲染 SVG 图像。
  • #2158:当找不到图像时,Markdown损坏。
  • #3679:损坏的Dismissible
  • #3670Switch.heightSwitch.width未被正确应用。
  • #3612#3566:损坏的OnScrollEvent
  • #3564:损坏的TextField.capitalization
  • #3649CupertinoPicker在某些平台上跳跃滚动。
  • #3557:Impeller 在 Mac Intel 上导致空白屏幕。
  • #3574Geolocator在 Android 设备上无法工作。
  • #3505WindowEventType不包含所有全屏事件。

感谢所有报告这些问题的人!

弃用

此版本中所有弃用的项目将在 0.27.0 版本中删除。

  • ThemeVisualDensity已弃用,并已重命名为VisualDensity
  • CupertinoButtondisabled_color已弃用,并已重命名为disabled_bgcolor,这更好地反映了其用途。
  • Markdowncode_style已弃用,现在应作为code_style_sheet.code_text_style访问。
  • Containerimage_fitimage_opacityimage_repeatimage_srcimage_src_base64已弃用,现在应从类型为DecorationImageimage访问。

重大变更和迁移

工具提示

Tooltip类不再是 Flet 控件,现在是一个简单的 Python 数据类。几乎所有控件中都可用的tooltip属性现在同时支持字符串和Tooltip对象。

以下是迁移方法:

# 之前
page.add(
ft.Tooltip(
message="This is tooltip",
content=ft.Text("Hover to see tooltip"),
padding=20,
border_radius=10,
)
)

# 之后
page.add(
ft.Text(
"Hover to see tooltip",
tooltip=ft.Tooltip(
message="This is tooltip",
padding=20,
border_radius=10,
)
)
)

TextFieldInputFilter

我们修改了InputFilter.regex_string的内部处理方式。因此,你(可能)现在需要锚定你的正则表达式模式。这仅仅意味着使用开始(^)和结束($)正则表达式锚点。

例如:r"[0-9]"现在变为r"^[0-9]$"。使用这个新字符串将按预期工作,并且只允许数字,但你可能会注意到另一个问题:文本字段的最后一个字符无法删除。要解决这个问题,你需要在正则表达式中添加一个星号(*),在这种情况下,这将简单地表示“匹配零个或多个数字(包括空字符串)”。新的正则表达式现在变为r"^[0-9]*$"

为了简化此迁移,你可以使用一个 AI 工具,使用以下简单提示:“更新以下正则表达式模式:####,确保整个字符串与模式匹配,并且允许空字符串”。

事件处理程序订阅

已删除将多个回调函数订阅到一个事件处理程序的可能性,因为这在某种程度上是有偏见的(仅在某些情况下可行,而不是在所有情况下)。

以下是一个简单的例子:

import flet as ft

def main(page: ft.Page):
def print_one(e):
print("1")
def print_two(e):
print("2")
def print_three(e):
print("3")
c = ft.Container(
bgcolor=ft.colors.random_color(),
width=300,
height=300,
)

# 订阅回调函数
c.on_tap_down = print_one
c.on_tap_down = print_two
c.on_tap_down = print_three
page.add(c)

ft.app(main)

在上面的代码中,我们将多个回调函数订阅到Container.on_tap_down事件。在 Flet 0.24.0 版本之前,运行此代码并点击Container,你将看到所有回调函数都被调用(打印出“1”、“2”和“3”)。

从 Flet 0.24.0 版本开始,一个事件 = 一个回调函数。这意味着只有最后订阅的回调函数将被执行(打印出“3”)。

因此,如果你仍然希望最终输出与第一个输出相似,你可以简单地创建一个回调函数,该函数调用其他函数:


def main(page: ft.Page):
#....

def print_all(e):
print_one(e)
print_two(e)
print_three(e)

c = ft.Container(
bgcolor=ft.colors.random_color(),
width=300,
height=300,
on_tap_down=print_all,
)

# 或者
c.on_tap_down = print_all

结论

如你所见,我们在这个版本中做了很多更改,和往常一样,非常欢迎你的反馈!

升级到 Flet 0.24.0,测试你的应用程序,并让我们知道你对我们添加的新功能的看法。

如果你有任何问题,请加入Flet Discord 服务器或在Flet GitHub 讨论上创建一个新线程。

快乐地使用 Flet!👾