Releases: flet-dev/flet
Releases · flet-dev/flet
Release list
v0.86.0.dev2
What's Changed
- Make auto_scroll follow in-place content growth by @FeodorFitsner in #6637
- fix(build): keep web apps on path routing through boot (no /#/, deep links survive) by @FeodorFitsner in #6639
- Fix auto_scroll end-following past code blocks / nested scrollables by @FeodorFitsner in #6642
- Fix O(N²) mount/unmount scans in Session.patch_control by @davidlawson in #6651
- Minor fix of changelog entry by @davidlawson in #6653
- flet-mcp: token-efficient get_api, ranked icon search, agent tool fixes by @FeodorFitsner in #6654
- Preserve ResponsiveRow child state across Row/Wrap layout switches by @FeodorFitsner in #6663
- feat: Multiprocessing support in packaged desktop apps by @ndonkoHenri in #6662
- Fix integration test failures caused by render overflow errors by @FeodorFitsner in #6664
New Contributors
- @davidlawson made their first contribution in #6651
Full Changelog: v0.86.0.dev1...v0.86.0.dev2
v0.86.0.dev1
What's Changed
- fix(ci): version flet-mcp like the other packages on publish by @FeodorFitsner in #6633
- fix(build): preserve flutter-packages on incremental builds (--skip-site-packages) by @FeodorFitsner in #6634
Full Changelog: v0.86.0.dev0...v0.86.0.dev1
v0.86.0.dev0
What's Changed
- Multi-version Python support (3.12 / 3.13 / 3.14) by @FeodorFitsner in #6577
- fix(flet-secure-storage): bump flutter_secure_storage 10.0.0 -> 10.3.1 to fix macOS data-protection keychain (-34018) on unsigned/dev apps by @EH-MLS in #6591
- feat(cli):
flet cleancommand + deprecate--clear-cacheflag offlet buildby @ndonkoHenri in #6590 - fix(typing): explicit handler signatures in
PubSubClientby @Iaw4tch in #6564 - chore: More docs + code improvements by @ndonkoHenri in #6589
- fix(android):
pickFirstslibc++_shared.soto unblock multi-plugin Flet apps by @ndonkoHenri in #6571 - Update CONTRIBUTING.md hello.py example to use modern
ft.run()andft.Page/ft.Textinstead of deprecated `flet.app by @Federicorao in #6582 - feat(
FilePicker): addcompression_qualityandcancel_upload_on_window_blurtopick_files()by @ndonkoHenri in #6573 - feat: add flet-spinkit extension package wrapping flutter_spinkit ^5.2.2 by @InesaFitsner in #6596
- Integrate dart-bridge into flet-0.86 (in-process FFI transport, multi-version Python, native-mmap, DataChannel) by @FeodorFitsner in #6601
- Lift app packaging into serious_python + SPM-by-default darwin builds by @FeodorFitsner in #6608
- Support Android TV in device info retrieval by @bl1nch in #6604
- 在android_sdk.py中令cmdline-tools-url检测到windows使用arm64架构时返回与x64相同的下载链接 by @xiaocai2011 in #6617
- Custom boot screen by @FeodorFitsner in #6616
- feat(flet-ads):
ConsentManagerfor AdMob UMP consent by @ndonkoHenri in #6615 - Rich progress bars for client and pyodide downloads by @FeodorFitsner in #6618
- feat:
flet teston-device integration testing + CI matrix by @FeodorFitsner in #6623 - Pin python-build 20260630 (armeabi-v7a for 3.13/3.14); serious_python 4.2.0 by @FeodorFitsner in #6628
- Add flet-mcp: MCP server for LLM agents by @FeodorFitsner in #6624
- ci: zizmor security checks by @ndonkoHenri in #6602
- Bump serious_python 4.2.1 / python-build 20260701 by @FeodorFitsner in #6630
New Contributors
- @EH-MLS made their first contribution in #6591
- @Iaw4tch made their first contribution in #6564
- @Federicorao made their first contribution in #6582
- @xiaocai2011 made their first contribution in #6617
Full Changelog: v0.85.3...v0.86.0.dev0
v0.85.3
What's Changed
Improvements
- Allow
[tool.flet.android.permission]values to be TOML inline tables in addition to booleans — eachkey = "value"entry adds anandroid:<key>="<value>"attribute to the generated<uses-permission>element, unlocking modifiers likeandroid:maxSdkVersionandandroid:usesPermissionFlagsthat real-world Android permissions (e.g. Bluetooth LE) require. The boolean form and the--android-permissionsCLI flag are unchanged; a non-empty inline table is always emitted, an empty table ({}) is treated asfalse, and invalid value types fail the build with a clear error (#6550, #6551) by @FeodorFitsner. - Add
[tool.flet.android.provider]for declaring custom<provider>entries in the generatedAndroidManifest.xml. Each table key is the provider'sandroid:name; entries becomeandroid:<key>="<value>"attributes on the generated element. A reservedmeta_datasub-table emits nested<meta-data>children (scalar values render asandroid:value="…"; inline-table values render asandroid:<k>="<v>"soandroid:resource="@xml/…"works).false/{}skip the entry;trueand invalid value types fail the build with a clear error. The built-inandroidx.core.content.FileProviderblock is unchanged (#6556, #6559) by @FeodorFitsner. - Upgrade the bundled Pyodide runtime in the
flet build webtemplate from0.27.5to0.27.7(includesmicropip0.9.0) (#6549) by @FeodorFitsner. - Drop generated
web/canvaskit/build artifacts (canvaskit.js/.wasm/.symbolsand thechromium/andskwasm/skwasm_stvariants) from theflet build webtemplate — these are produced by the Flutter web build and should not have been committed into the cookiecutter template (#6549) by @FeodorFitsner. - Cache the downloaded
flet-build-template.zipacross builds. The build template is bound to an exact Flet version and is immutable, so on everyflet build/flet debugafter the first, the CLI now uses a previously-downloaded zip from$FLET_CACHE_DIR/build-template/v<flet-version>/(defaulting to~/.flet/cache/build-template/v<flet-version>/) instead of re-fetching it via cookiecutter. The CLI also exportsFLET_CACHE_DIRinto the child Gradle process, soserious_python_android>= 1.0.1 lands its Python dist tarballs (python-android-dart-<py>-<abi>.tar.gz) in the same cache root by default — fixing the multi-minute "Creating app shell" /downloadDistArchive_*delay on every Android debug build. Custom--templateURLs and the local-dev template path are unchanged (#6555, #6558) by @FeodorFitsner. - Bump the bundled build template's
serious_pythondependency from1.0.0to1.0.1so Android builds pick up the new persistent Python-tarball cache + conditional-GET revalidation introduced inserious_python1.0.1 (#6558) by @FeodorFitsner.
Bug fixes
- Fix
flet.Router's defaulton_view_popnavigating to the wrong URL when anoutlet=Truelayout sits between two views inmanage_views=Truemode. Popping such a view now targets the previous view entry's resolved URL — skipping outlet layouts and componentless grouping routes — instead ofchain[-2], which could equal the current view's URL and strand the page route, making the next navigation to it a no-op (#6533) by @FeodorFitsner. - Fix
flet-audio.Audio.play()/seek()timing out when replaying after playback had completed: under the defaultReleaseMode.RELEASEthe source is freed on completion and is now re-prepared on replay (#6536, #6538) by @ndonkoHenri. - Fix
ft.run(view=ft.AppView.FLET_APP_HIDDEN)briefly flashing the native window in the top-left corner during Windows desktop startup. The Windows runner now respectsFLET_HIDE_WINDOW_ON_STARTand skips the first-frameShow()call so the window stays hidden untilpage.window.visible = True, matching the Linux desktop behavior; the same fix is applied to theflet build windowstemplate runner so generated apps behave consistently. On Linux, pre-show window placement actions (page.window.center(),page.window.alignment) are now deferred until the window first becomes visible to avoid an analogous flash, and the window'sfocusedstate is preserved when aprevent_closehandler cancels a close attempt (#5897, #5914, #6527) by @ihmily.
Full Changelog: v0.85.2...v0.85.3
v0.85.3.dev1
What's Changed
- feat(build): cache flet-build-template.zip; share FLET_CACHE_DIR with Gradle by @FeodorFitsner in #6558
- feat(build): support custom entries in AndroidManifest via pyproject.toml by @FeodorFitsner in #6559
Full Changelog: v0.85.3.dev0...v0.85.3.dev1
v0.85.3.dev0
What's Changed
- docs(studio): add Flet Studio landing page and docs section by @FeodorFitsner in #6523
- docs(studio): give Studio its own footer column by @FeodorFitsner in #6524
- Tests and screenshots for Featured apps; fix for palette editor color picker by @InesaFitsner in #6521
- fix: add CMake definition to silence MSVC coroutine deprecation error by @ihmily in #6525
- docs(studio): Flet Studio launch post + updated gallery links by @FeodorFitsner in #6534
- Flet Studio update and skip builds for website/tools-only changes by @FeodorFitsner in #6537
- fix(router): pop to previous view, not the outlet layout URL by @FeodorFitsner in #6533
- Renamed titles of basic examples by @InesaFitsner in #6535
- docs: inject example headings dynamically from pyproject.toml metadata by @InesaFitsner in #6544
- Fix build web template: drop canvaskit artifacts, bump Pyodide to 0.27.7 by @FeodorFitsner in #6549
- refactor: rename and normalize example folder and package names by @InesaFitsner in #6545
- fix: honor AppView.FLET_APP_HIDDEN in Windows and Linux desktop runners by @ihmily in #6527
- feat(build): allow attributes on Android entries by @FeodorFitsner in #6551
- fix(flet-audio): replaying
Audioafter completion underReleaseMode.RELEASEraisesTimeoutExceptionby @ndonkoHenri in #6538
Full Changelog: v0.85.2...v0.85.3.dev0
v0.85.2
What's Changed
- fix: reject session reuse when existing connection is still active by @ihmily in #6513
- feat(router): add
modal/recursiveRoute flags + chain-based pop by @FeodorFitsner in #6516 - docs: add 0.85.2 changelog entry for #6513 session reuse fix by @FeodorFitsner in #6518
- docs: add release migration-guide page for breaking changes and deprecations by @ndonkoHenri in #6517
New Contributors
Full Changelog: v0.85.1...v0.85.2
v0.85.1
Bug fixes
- Fix
TooltipTheme.decorationso it applies to controls usingft.Tooltip(...)when the tooltip does not explicitly setdecorationorbgcolor(#6432, #6482) by @ndonkoHenri. - Fix
flet-geolocator.Geolocatorreliability on web and desktop:get_last_known_position()no longer crashes withTypeError: argument after ** must be a mapping, not NoneTypeand now returnsOptional[GeolocatorPosition];get_current_position()no longer hangs forever on web (Dart-side workaround for the upstreamgeolocator_web4.1.3inMicroseconds/inMillisecondstimeout typo) and uses sensible web defaults (time_limit: 30s,maximum_age: 5m); the previously-droppedconfigurationargument now actually reachesgetCurrentPositionon the Dart side; the position stream is gated behind a registeredon_position_change/on_errorhandler (with cancel-on-update to prevent leaks); and platform exceptions (LocationServiceDisabledException,PermissionDeniedException,PermissionDefinitionsNotFoundException,PermissionRequestInProgressException,PositionUpdateException,TimeoutException) are now translated into actionable error messages and surfaced to Python asRuntimeErrorwithout the defaultException:prefix (#6487) by @FeodorFitsner. - Fix PEP 508 markers on
flet'soauthlib/httpxdeps not actually excluding those packages under Pyodide: theflet build webpackage platform has been renamed fromPyodidetoEmscriptento matchplatform.system()inside the Pyodide runtime, and the markers now useplatform_system != 'Emscripten', so the exclusion works both viaflet buildand a directmicropip.install("flet")in a Pyodide REPL. Requiresserious_python>= 1.0.0, which is now pinned in theflet buildtemplate (#6492) by @FeodorFitsner.
v0.85.0
What's Changed
New features and improvements
- Add configurable built-in, custom, hidden, and normal/fullscreen-specific controls to
flet-video;Video.take_screenshot()for capturing video frames; andVideo.on_position_change/Video.on_duration_changeevents (#6463) by @ndonkoHenri. - Add declarative
ft.Routercomponent for@ft.componentapps with nested routes, layout routes with outlets, dynamic segments, optional segments, splats, custom regex constraints, data loaders, active link detection, authentication patterns, andmanage_views=Truemode for view-stack navigation with swipe-back gestures andAppBarback button on mobile (#6406) by @FeodorFitsner. - Add
ft.use_dialog()hook for declarative dialog management from within@ft.componentfunctions, with frozen-diff reactive updates and automatic open/close lifecycle (#6335) by @FeodorFitsner. - Add
scrollable,pin_leading_to_top, andpin_trailing_to_bottomproperties toNavigationRailfor scrollable content with optional pinned leading/trailing controls (#1923, #6356) by @ndonkoHenri. - Add scroll support to
ResponsiveRowfor responsive layouts whose content exceeds the available height (#2590, #6417) by @ndonkoHenri. - Add
issuesproperty toCodeEditor(along withIssueandIssueTypetypes) for displaying code analysis error markers in the gutter, with analysis performed on the Python side (#6407) by @FeodorFitsner. - Add
Page.pop_views_until()to pop multiple views and return a result to the destination view (#6326, #6347) by @brunobrown. - Make
NavigationDrawerDestination.labelaccept custom controls and addNavigationDrawerTheme.icon_theme(#6379, #6395) by @ndonkoHenri. - Add
local_positionandglobal_positiontoDragTargetEvent, deprecatingx,y, andoffset(#6387, #6401) by @ndonkoHenri. - Added PCM16 streaming to
AudioRecorder, includingon_streamchunks and direct upload support viaAudioRecorderUploadSettings(#5858, #6423) by @ndonkoHenri. - Add
Page.theme_animation_stylefor customizing the duration and curve of the theme cross-fade betweenthemeanddark_theme(or disabling it withAnimationStyle.no_animation()), exposing Flutter'sMaterialApp.themeAnimationStyle(#6476) by @FeodorFitsner.
Bug fixes
- Fix control diffing for controls nested inside
@valuedataclass objects so they keep the nearest control parent/page context, and restore optional structured properties that are cleared toNoneand later set again (#6463) by @ndonkoHenri. - Fix
PageandViewvertical centering when scrolling is enabled, including hidden scrollbars, so short content remains centered in the viewport (#6446, #6450) by @ndonkoHenri. - Reduce Linux memory retention when repeatedly removing
flet_video.Videocontrols by linkingmedia_kitvideo apps against mimalloc in run and build flows (#6164, #6416) by @ndonkoHenri. - Fix
flet buildandflet publishdependency parsing forproject.dependenciesand Poetry constraints with</<=, and add coverage for normalized requirement handling (#6332, #6340) by @td3447. - Fix
CodeEditorbackground not filling the entire area whenexpand=True(#6407) by @FeodorFitsner. - Handle unbounded width in
ResponsiveRowwith an explicit error, treat child controls withcol=0as hidden, and clarifyContainerexpansion behavior whenalignmentis set (#1951, #3805, #5209, #6354) by @ndonkoHenri. - Fix
find_platform_imageselecting incompatible icon formats (e.g..icnson Windows) by ranking glob results per target platform (#6381) by @HG-ha. - Fix
page.window.destroy()taking several seconds to close Windows desktop apps whenprevent_closeis enabled (#5459, #6428) by @ndonkoHenri. - Fix
Page.show_drawer(),close_drawer(), and root/top view accessors (appbar,drawer,navigation_bar,controls, ...) failing withTypeErrorunderPage.render_views()by unwrapping component-wrapped views and normalizing single-view returns (#6413, #6414) by @FeodorFitsner. - Fix
auto_scrollon scrollable controls silently doing nothing unlessscrollwas also explicitly set (#6397, #6404) by @ndonkoHenri. - Fix Flet web returning
index.htmlwith a200 OKfor missing asset files; requests for paths with a file extension other than.htmlnow return a proper404, while route-like paths still fall back toindex.htmlfor SPA routing (#6425) by @ndonkoHenri. - Fix
Lottiefailing to load local asset files on Windows desktop (and unreliably on other desktop platforms), so animations referenced bysrc="file.json"from the app'sassets/directory now display correctly (#6386, #6426) by @ndonkoHenri. - Fix
Page.on_resizeandPage.on_media_changenot firing after mobile orientation changes (#6457, #6423) by @ndonkoHenri. - Fix
flet packdesktop packaging so Windows and Linux bundles include the expected client archive, and Windows taskbar pins point to the packed app instead of the cachedflet.exe(#5151, #6403) by @ndonkoHenri. - Fix environment variable priority in
flet buildtemplate: inherit fromPlatform.environmentand useputIfAbsentfor FLET_* variables so pre-set system env vars are not overwritten (#6394) by @Bahtya. - Fix
NavigationBarDestination.selected_iconrendering wrongly when provided as anIconcontrol (#6460, #6468) by @ndonkoHenri. - Fix 3- and 4-digit hex color shorthand (e.g.
#c00,#fc00) rendering as invisible by expanding them to their full 6/8-digit forms (#6419, #6421) by @ndonkoHenri. - Fix
LineChartEvent.spotsreturning undecoded MessagePack extension values instead ofLineChartEventSpotobjects (#6443, #6468) by @ndonkoHenri. - Fix
LineChart(and other charts) silently dropping customChartAxisLabelentries whosevaluematched a tick only after floating-point rounding (e.g.0.1,0.2,0.3) by switching label lookup to a tolerance-based comparison scaled to the axis interval (#6445, #6459) by @KangZhaoKui. - Fix absolute-path
src(e.g.Image(src="/images/foo.svg")) breaking on web when the app is mounted at a non-root URL, passdata:/blob:URIs through the asset resolver unchanged, preserve origin-relative semantics whenassets_diris unset, and add awindow.flet.assetsDirJS-interop bridge so embedding hosts can supplyassets_dirto the top-levelFletApp(#6470) by @FeodorFitsner. - Fix unbounded browser memory growth in
MatplotlibCharton Flutter web (CanvasKit/WASM) during animations by replacing theCanvas+capture()rendering path with a dedicatedMatplotlibChartCanvaswidget that composites matplotlib diff frames in CPU memory; also fixes Safari async PNG decode (EncodingError: Loading error.), a render/figure.savefig()race that crashed the toolbar Download, and pan/zoom playback lag from buffered pointer events (#6473) by @FeodorFitsner. - Fix
Durationfields (and otherint-typed properties) silently decoding to0when given a Pythonfloat(e.g.Duration(seconds=2.0)causingPage.theme_animation_styleto end instantly) by coercingdoubletointin the Dart-sideparseInt(#6478, #6480) by @FeodorFitsner.
Documentation
- Improve CrocoDocs API reference rendering with formatted signatures, modern type annotations, and cleaner cross-reference labels for extension packages ([#6442](ht...
v0.85.0.dev4
What's Changed
- perf(flet-charts): faster MatplotlibChart rendering on native, simpler Python loop by @FeodorFitsner in #6479
- fix:
Durationfields decode to 0 when passed as float (#6478) by @FeodorFitsner in #6480
Full Changelog: v0.85.0.dev3...v0.85.0.dev4