Flet v0.24.0 Release Announcement
I am very happy to announce the release of Flet version 0.24.0! It comes with a very long list of bug fixes, several enhancements and new features.
New Controls
New Properties
AudioRecorder:cancel_recording()Video:on_completed,on_track_changedInputFilter:unicode,case_sensitive,dot_all,multilineGeolocator:on_error,on_position_changeBarchart,LineChart:tooltip_border_side,tooltip_direction,tooltip_fit_inside_horizontally,tooltip_fit_inside_vertically,tooltip_horizontal_offset,tooltip_margin,tooltip_max_content_width,tooltip_padding,tooltip_rounded_radius,tooltip_rotate_angleContainer:decoration,foreground_decoration,ignore_interactions,imagePage,View:decoration,foreground_decorationCupertinoTextField:enable_scribble,image,obscuring_character,padding,scroll_padding,on_clickDataTable:heading_row_alignmentTextField:counter,disabled_hint_content,options_fill_horizontallyExpansionTile:min_tile_height,show_trailing_iconMarkdown:fit_content,img_error_content,md_style_sheet,shrink_wrap,soft_line_break,on_selection_changeMenuItemButton:autofocus,overflow_axis,semantic_labelTabs:label_padding,label_text_style,padding,splash_border_radius,unselected_label_text_style,on_click- and lot of new classes (enums, dataclasses, events)…
Enhancements
- Better string output of Events when printed
Image.filter_qualitynow has a default ofFilterQuality.MEDIUM(previouslyFilterQuality.LOW), which is a better default for downscaled images.Geolocatorcontrol has been improved to support location streaming through the newly added on_position_change event. When defined, you will be able to "listen" to location changes as they happen.- When
AppBar.adaptive=Trueand the app is running on an Apple platform, theAppBar.actionscontrols are now wrapped in aRow, then displayed. Before this, only the first item ofAppBar.actionslist was displayed. - The
Markdowncontrol has been significantly improved. It can now display SVG images and be much more customized. - A very requested feature was the ability to set a background image or gradient for the application. In #3820, we made this possible and easy to use.
- rtl (right-to-left) property has been added to more controls (
NavigationRailDestination,NavigationRail,AppBar,CupertinoAppBar, andNavigationDrawer) to improve support for right-to-left text directions. - Introduced
--no-rich-outputflag (only inflet buildcommand for now) to make it possible to disable rich output (mainly emojis) in the console. More information in #3708. - Typing has been significantly improved, particularly for event-handler properties. In modern IDEs like PyCharm and VSCode, you can now easily determine the type of an event handler's argument by simply hovering over the event in the control. Additionally, the IDE will highlight errors when you attempt to access a non-existent property on the event handler argument, ensuring more robust and error-free code.
Bug Fixes
The below issues were successfully fixed:
- #3769:
InputFilterclears theTextFieldtext content when an invalid character is entered - #3770:
Theme.floating_action_button_themenon existent - #3734: Ensure
Dropdown.alignmentis respected. - #3730:
UnicodeEncodeErrorraised when packaging on WindowOS - #2160:
Markdowncontrol can't render svg images - #2158:
Markdownbroken when an image is not found - #3679: Broken
Dismissible - #3670:
Switch.heightandSwitch.widthnot respected - #3612, #3566: Broken
OnScrollEvent - #3564: Broken
TextField.capitalization - #3649:
CupertinoPickerjumps-scroll on some platforms - #3557: Impeller causes blank screen on mac Intel
- #3574:
Geolocatornot working on Android devices - #3505:
WindowEventTypedoesn't contain fullscreen all events
Thanks to all those who reported them!
Deprecations
All deprecated items from this release will be removed in version 0.27.0.
ThemeVisualDensityis deprecated and has been renamed toVisualDensityCupertinoButton:disabled_coloris deprecated and has been renamed todisabled_bgcolor, which better reflects its useMarkdown:code_styleis deprecated and should now be accessed ascode_style_sheet.code_text_styleContainer:image_fit,image_opacity,image_repeat,image_srcandimage_src_base64are deprecated and should now be accessed fromimagewhich is of typeDecorationImage
Breaking Changes and Migration
Tooltip
The Tooltip class is no more a Flet control and is from now on a simple Python dataclass. The tooltip property (available in almost all controls) now supports both strings and Tooltip objects.
Below is how to migrate:
# before
page.add(
ft.Tooltip(
message="This is tooltip",
content=ft.Text("Hover to see tooltip"),
padding=20,
border_radius=10,
)
)
# after
page.add(
ft.Text(
"Hover to see tooltip",
tooltip=ft.Tooltip(
message="This is tooltip",
padding=20,
border_radius=10,
)
)
)
TextField InputFilter
We modified how InputFilter.regex_string is internally handled. As a result of this, you (might) now have to anchor your regex pattern. This simply implies using start (^) and end ($) regex anchors.
For example: r"[0-9]" now becomes r"^[0-9]$". Using this new string will lead work as expected and only numbers/digits will be allowed, but you might notice another issue: the last character of the text field cannot be deleted. To resolve this, you need to add an asterisk (*) in the regex which in this case will simply mean "match zero or more digits (including an empty string)". The new regex now becomes r"^[0-9]*$".
To ease this migration, you can use an AI tool with the following simple prompt: "update the following regex pattern: #### ensuring that the entire string matches the pattern and it allows for an empty string".
Event-Handler subscription
The possibility to "subscribe" more than one callback to an event handler has been removed, as this was somehow biased (was only possible on some, and not all). Below is a simple example:
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,
)
# subscribe callbacks
c.on_tap_down = print_one
c.on_tap_down = print_two
c.on_tap_down = print_three
page.add(c)
ft.app(main)
In the above code, we subscribe multiple callbacks to the Container.on_tap_down event. Prior to Flet version 0.24.0, running this code and tapping on the Container, you will see all the callbacks getting called ("1", "2" and "3" are printed out).
From Flet version 0.24.0 going forward, one event = one callback. Meaning only the lastly subscribed callback will get executed ("3" is printed out)
So, if you still want the final output to resemble the first one you can simply create one callback which calls the others:
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,
)
# OR
c.on_tap_down = print_all
Conclusion
As you can see, we made a lot of changes in this release and as usual, your feedback is highly welcomed!
Upgrade to Flet 0.24.0, test your apps and let us know how you find the new features we added. If you have any questions, please join Flet Discord server or create a new thread on Flet GitHub discussions.
Happy Flet-ing! 👾