Update flet packages to v0.86.0#70
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
Contributor
|
Important Review skippedBot user detected. To trigger a single review, invoke the You can disable this status message by setting the
Comment |
8b579a2 to
ebf2087
Compare
ebf2087 to
c1f9995
Compare
c1f9995 to
73a3a5a
Compare
73a3a5a to
1b16ba1
Compare
1b16ba1 to
1b545fd
Compare
1b545fd to
f07554f
Compare
f07554f to
53d1e90
Compare
53d1e90 to
bf65806
Compare
bf65806 to
18ccaba
Compare
18ccaba to
7c651b9
Compare
7c651b9 to
bd0e9dc
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
==0.80.4→==0.86.0==0.80.4→==0.86.0==0.80.4→==0.86.0Release Notes
flet-dev/flet (flet)
v0.86.0Compare Source
New features
multiprocessingin packaged Flet desktop apps built withflet build macos,flet build windows, andflet build linux.multiprocessingAPIs such asProcess,ProcessPoolExecutor, thespawn/forkserverstart methods, and the resource tracker now work in packaged desktop apps. Previously, worker processes re-executedsys.executable, which pointed to the app binary itself, causing each worker to launch another GUI app instance and hang. Flet desktop runners now detect CPython multiprocessing child command lines before Flutter starts and divert them to a headless embedded Python interpreter viadart_bridge1.5.0+. The Python bootstrap also runs the app module as the realsys.modules["__main__"]withpython -msemantics, so top-level worker functions inmain.pycan be pickled correctly. When usingmultiprocessing, your app must follow normal Python multiprocessing rules: guardft.run(...)withif __name__ == "__main__":, define worker functions at module top level, and do not access Flet UI objects from worker processes. See the new Multiprocessing cookbook page. Mobile platforms remain unsupported because iOS and Android do not allow apps to spawn arbitrary child processes (#4283, #6577) by @ndonkoHenri.flet buildandflet publish. Pick the runtime your app ships with via the new--python-versionflag (3.12 / 3.13 / 3.14), or let it be derived from[project].requires-pythonin yourpyproject.toml; defaults to the latest supported stable (currently 3.14). The matching CPython-standalone build, Pyodide release (0.27.7 / 0.29.4 / 314.0.1), and Emscripten wheel platform tag are all resolved fromflet-dev/python-build's date-keyed manifest. Adding a future pre-release CPython line (e.g. 3.15 beta) is a one-row append withprerelease=True— opt-in only via an explicit--python-version 3.15orrequires-python = "==3.15.*", never the auto-resolved default. Requiresserious_python>= 4.0.0, now pinned in theflet buildtemplate. See the new Choosing a Python version docs section (#6577) by @FeodorFitsner.ft.DataChannel: dedicated byte channels for widgets that move bulk binary data (image frames, audio buffers, ML tensors) between Dart and Python, bypassing the MsgPack control protocol. The Dart side opens a channel viaFletBackend.of(context).openDataChannel()and announces it to Python by firing adata_channel_opencontrol event with{channel_name, channel_id}; the Python side declareson_data_channel_open: Optional[ft.EventHandler[ft.DataChannelOpenEvent]]and captures the channel viaself.get_data_channel(e.channel_id). Backed by a dedicatedPythonBridgeper channel in embedded native mode (4–7 GiB/s on M2 Pro) and by the defaultProtocolMuxedDataChannelFactoryin dev / web modes (raw-byte frames muxed over the active Flet protocol transport with a 1-byte type discriminator). Pyodide gets zero-copy outbound sends viapostMessageTransferable ArrayBuffer. First consumer:flet-chartsMatplotlibChartCanvas, migrated from_invoke_methodPNG dispatch to a 1-byte-opcode data channel by @FeodorFitsner.dart_bridgeFFI).package:fletgains a third protocol transport alongside the UDS / TCP socket servers: it can run Flet's MsgPack protocol over an in-processdart_bridgebyte channel via aFletApp(channelBuilder: …)seam (thefletpackage stays Python-independent — it doesn't depend onserious_pythonor know aboutPythonBridge; the embedder wires the channel).serious_python>= 3.0.0 uses this seam to embed the Python interpreter in-process instead of talking to it over a localhost socket, and theflet buildtemplate migrates from sockets to the FFI transport. On Android, where the OS may keep the process alive across a back-button quit and restart only the Dart VM, the transport rebinds to the new VM'sdart_bridgeports on a session-restart signal (libdart_bridge>= 1.3.0) — the Python process and its in-memory state are preserved and the Flet session is rebuilt fromREGISTER_CLIENTby @FeodorFitsner.flet cleancommand that deletes thebuilddirectory of a Flet app — the Flutter bootstrap project, cached artifacts, and generated output — in a single step (#6233) by @ndonkoHenri.compression_qualitytoFilePicker.pick_files()for selecting the image compression quality used by supported platforms (#6573) by @ndonkoHenri.ConsentManagertoflet-adsfor gathering user consent (e.g. GDPR/EEA) via Google's User Messaging Platform (UMP) before requesting ads (#6569, #6615) by @ndonkoHenri.ft.RawImage: a high-bandwidth pixel-frame display control for Pillow output, NumPy arrays, camera frames and procedural graphics. Frames stream over a dedicatedft.DataChannelinstead of the control protocol: raw premultiplied RGBA straight to a GPU texture on local transports (desktop,flet run, Pyodide), automatic PNG fallback on remoteflet-websessions. The awaitablerender(pil_or_numpy)/render_rgba(w, h, bytes)/render_encoded(png_jpeg_webp_bytes)methods resolve when the client has displayed the frame, so a plainwhile True: await ri.render(...)loop self-paces to display speed. Premultiplied-alpha conversion runs in Pillow's C loops with an opaque fast-path; Pillow and NumPy remain optional. The last frame is retained and replayed on remount, mirroringImage.src. Ships with five gallery examples (photo viewer, plasma, Pillow paint, Mandelbrot explorer, Game of Life) and a docs page withRawImagevsImageguidance (#6674) by @FeodorFitsner.Improvements
flet build/flet debugnow integrate the embedded Python runtime via SPM instead of CocoaPods (CocoaPods goes read-only in December 2026). Flet auto-falls back to CocoaPods when the app depends on a package that isn't SPM-ready — currentlyflet-video(media_kit) — since Flutter then builds the whole app with CocoaPods. Force CocoaPods for other non-SPM packages with--no-swift-package-manager(orswift_package_manager = falseunder[tool.flet]). Flet does not change Flutter's global SPM configuration; the setting only selects howserious_pythonstages the runtime to match. When SPM is used (it has nopod installhook),flet buildsetsSERIOUS_PYTHON_DARWIN_SPMsoserious_python'spackagestep stages the runtime (Python/dart_bridge xcframeworks, the iOS native extensions, and the stdlib/site-packages/app resources) into the plugin'sPackage.swiftlayout on the host beforeflutter build, and exports theSP_NATIVE_SETcache-bust key into the build. Requires the SPM-capableserious_pythonrelease.flet build apk/aabconsume serious_python's new Android packaging: Python extension modules load memory-mapped directly from the APK (no extraction to disk), and pure Python ships in stored asset zips read viazipimport, so the standard library is no longer duplicated per ABI. Apps no longer needuseLegacyPackaging/keepDebugSymbols— theflet buildAndroid template drops them; just useminSdk 23+. New--android-extract-packagesflag and[tool.flet.android].extract_packagesship "path-hungry" packages — those that read bundled data via__file__/pkg_resourcesinstead ofimportlib.resources— extracted to disk instead of inside the zip (most packages, includingcertifi, are zip-safe and need no entry). Requiresserious_pythonwith the native-mmap packaging (dart_bridge 1.4.0).flet buildtemplate. Eachflet build web/flet publishrun downloads the matchingpyodide-core-<version>.tar.bz2(plus the runtimemicropipandpackagingwheels) into a per-version cache at~/.flet/pyodide/<version>/and copies the files into the build output. Subsequent builds reuse the cache; the older0.27.5bundle previously shipped in the cookiecutter template is gone (#6577) by @FeodorFitsner.flet-dev/python-build's date-keyedmanifest.json(fetched once and cached under~/.flet/cache), the single source of truth shared withserious_python— replacing flet's hand-mirrored version table.flet buildforwards onlySERIOUS_PYTHON_VERSIONand letsserious_pythonderive the full version / build date / dart_bridge version from its own committed snapshot. The module exposesget_supported_python_versions()/get_default_python_version()(the previousSUPPORTED_PYTHON_VERSIONS/DEFAULT_PYTHON_VERSIONconstants are removed) (#6577) by @FeodorFitsner.flet --versionshows just the Flet and Flutter versions; the staticPyodide: …line and the globalflet.version.pyodide_versionexport are removed (the supported Python / Pyodide set now lives in python-build's manifest, not the CLI output) (#6577) by @FeodorFitsner.flet --version --jsonemits a machine-readable document — Flet/Flutter versions and the Linux build dependencies — for CI to read viajqinstead of importing Flet internals withpython -c. (The supported Python/Pyodide table is no longer included; it comes from python-build's manifest.) The canonical Linux apt dependency list moved fromflet.utils.linux_deps(runtime package) toflet_cli.utils.linux_deps(build tooling) by @FeodorFitsner.client/web/python.jsand the build template'spython.jsno longer hardcodedefaultPyodideUrl.patch_index.pynow injectsflet.pyodideUrlper build (CDN URL by default, or the localpyodide/pyodide.jspath under--no-cdn) so the runtime URL always tracks the resolved Pyodide release (#6577) by @FeodorFitsner.flet rundev mode) now use length-prefixed framing instead of streamingmsgpack.Unpacker.feed. Combined with a new 1-byte type discriminator at the head of every packet (0x00= MsgPack control frame,0x01= raw DataChannel frame), this unifies framing across all transports (sockets, WebSocket,dart_bridgeFFI, PyodidepostMessage).StreamingMsgpackDeserializeris removed frompackage:flet; each inbound packet is one complete MsgPack value, decoded one-shot viamsgpack.deserialize(bytes)by @FeodorFitsner.flet buildtemplate migrate to Flutter 3.44's built-in Kotlin (the Android app no longer applies the Kotlin Gradle plugin itself) and Java 17; the client's Gradle wrapper moves to 8.14 by @FeodorFitsner.MatplotlibChartnow skips per-frame diffing and PNG encode/decode when the client runs on the same machine: uncompressed RGBA full frames stream straight from Agg's buffer over the chart'sDataChannel(new0x04opcode) and are displayed with a singledecodeImageFromPixels+ swap on the Dart side. A 1600×1000 @ DPR 2 figure (24 MB/frame) over a local socket goes from 7.4 to 18.7 fps, leaving matplotlib's own render as the dominant per-frame cost; remote WebSocket clients keep the compact PNG full+diff pipeline. The format is auto-selected via the newConnection.local_data_transportcapability flag (set by the socket,dart_bridgeand Pyodide transports). Also fixes O(n²) length-prefixed packet reassembly in the Dart socket transport — multi-MB frames arrive in dozens of chunks and previously re-flattened the accumulation buffer on every chunk (#6673) by @FeodorFitsner.flet build webandflet publishnow default the web renderer tocanvaskitinstead ofauto. Withauto, Chromium selects the dart2wasm/skwasm renderer, whose JS↔Dart typed-data boundary costs make byte-streaming Pyodide apps (matplotlib frames,RawImage) ~6–7x slower per frame; pass--renderer autoor set[tool.flet.web].rendererto restore the old behavior. Also fixestool.flet.web.rendererbeing ignored byflet publish(shadowed by an argparse default) (#6673) by @FeodorFitsner.import fletis now lazy. Thefletpackage previously executed its full ~270-module public API eagerly onimport flet; it now resolves public names on first access via a module-level__getattr__(PEP 562), so an app loads only the modules it actually uses. On a mid-range Android device this cutimport fletfrom ~2.0s to ~0.15s. The eager subsystem clusters thatPagepulled in (auth, components/hooks, Cupertino controls) are deferred too. Type checkers, IDEs, andfrom flet import *are unaffected (#6597) by @FeodorFitsner.Breaking changes
serious_python>= 4.0.0, now pinned in theflet buildtemplate). Your Python sources ship unpacked inside the app bundle next to the stdlib/site-packages (no first-launchapp.zipextraction) on macOS/iOS/Windows/Linux; on Android they ship as a storedapp.zipasset unpacked once on first launch; web is unchanged. The app directory is now read-only, so the Python program's working directory moved to a writable, app-private data dir.FLET_APP_STORAGE_DATAnow maps to the OS application support dir (adatasubdir) instead of the user's Documents folder and is the cwd;FLET_APP_STORAGE_TEMPnow points to the OS temp dir (was the cache dir) and a newFLET_APP_STORAGE_CACHEexposes the cache dir.flet runsets the dev cwd to a hidden, git-ignored<project>/.flet/storage/data. Relative reads of bundled files (open("seed.json")) must move to__file__/importlib.resourcesorassets/. See the app files unpacked / storage dirs guide by @FeodorFitsner.flet buildandflet publishnow bundle CPython 3.14 by default (previously 3.12, implicit via the old single-versionserious_python). Existing apps that depend on native wheels without 3.14 binaries should pin explicitly with--python-version 3.12(CLI),requires-python = ">=3.12,<3.13"(pyproject), orSERIOUS_PYTHON_VERSION=3.12in the build environment (#6577) by @FeodorFitsner.pythons.<short>.android_abis) rather than hardcoded in flet. As of python-build20260630,armeabi-v7a(32-bit ARM) is published for 3.12, 3.13 and 3.14, so all three build it by default; an explicit--arch <abi>is validated against the selected Python's supported set and fails with a clear error otherwise (#6578) by @ndonkoHenri.flet build/flet publishnow compile your app and packages to.pycby default (previously off). This removes per-launch bytecode recompilation — a significant cold-start win, especially on mobile where pure Python is imported from a stored zip (zipimport) and can't cache bytecode back to disk, so every module would otherwise recompile from source on each launch. The CLI flags gain--no-compile-app/--no-compile-packages(viaargparse.BooleanOptionalAction; the existing--compile-app/--compile-packagesstill work), and[tool.flet.compile].app/.packagesnow default totrue. Pass--no-compile-*or set them tofalseto restore the old behavior (faster iterative builds, or keeping.pysource in the bundle). Compiled web builds were verified to load in Pyodide (bundled CPython and Pyodide share the same minor version). See the compile-on-by-default guide (#6598) by @FeodorFitsner.0x00= MsgPack control frame,0x01= raw DataChannel frame). WebSocket /postMessage/dart_bridgetransports keep native message boundaries and only gain the type byte. The Flet CLI dev server and the in-process Python runtime are upgraded in lockstep — runningflet runwith mismatchedfletversions across CLI and runtime is no longer supported. See the DataChannel protocol framing upgrade guide. TheMatplotlibChartCanvaswidget transports its full / diff / clear frames via aDataChannelrather than_invoke_methodarguments — visually identical, but custom code that subclassed it and overrode the apply methods may need updating by @FeodorFitsner.Deprecations
--clear-cacheflag offlet buildandflet debug; use the newflet cleancommand instead. The flag remains functional but now emits a deprecation warning, and is scheduled for removal in0.89.0(#6233) by @ndonkoHenri.Bug fixes
'!_dirty': is not trueassertion (EXCEPTION CAUGHT BY WIDGETS LIBRARYin_BootOverlay) thrown by apps built or debugged from theflet buildtemplate when the app becomes ready. With the defaultboot_screen.fade_out_durationof 0 the overlay's zero-durationAnimatedOpacitycompleted synchronously, firingonEnd— and itssetState— in the middle of the overlay's own rebuild. The overlay is now removed in a single state update when no fade is configured; non-zero fade durations still animate as before. Debug-mode only: the assertion is compiled out of release builds (#6666) by @FeodorFitsner.flet buildfailing on Windows when a dependency is pulled in via[tool.flet.<platform>].dev_packages(or any local-path install): the rewritten<pkg> @​ file://<path>URL now usesPath.as_uri(), producing the correctfile:///D:/...three-slash form instead offile://D:\..., which pip on Windows parsed as a UNC path and aborted withOSError: [Errno 2] No such file or directory: '\\\\D:\\a\\...'(#6577) by @FeodorFitsner.flet build web --python-version 3.13failing to match any Pyodide-built native wheel. The 3.13 row in the Python version registry was set to Pyodide platform tagpyodide-2025.0-wasm32, but Pyodide actually publishes 0.29 wheels underpyemscripten_2025_0_wasm32(thepyodide_→pyemscripten_prefix transition happened at 0.28/0.29, not at 314.0). Corrected topyemscripten-2025.0-wasm32so pip's wheel selection picks up the correct tags by @FeodorFitsner.flet buildnow cleans the build directory when the bundled Python version changes between builds, preventing stale compiled bytecode from the previous version crashing the app at runtime withImportError: bad magic numberby @FeodorFitsner.keyin tests.ValueKey(control.key)was constructed asValueKey<Object>, and Flutter's runtimeType-strictValueKey.==never matches that against theValueKey<String>the rendered widget carries — sofind.byKey(Key('foo'))(flutter_test) andfind_by_key('foo')(Flet tester) located 0 widgets. TheValueKeyis now built with the value's concrete type (String →ValueKey<String>, int →ValueKey<int>, …) on both the Dart and Python sides by @FeodorFitsner.flet build apk/flet build aabwith--archpackaging native libraries for all Android ABIs instead of only the requested ones. The requested architectures are now forwarded to Flutter as--target-platform(so--split-per-abibuilds only the requested splits), unrequested ABI directories are excluded from the artifact viapackaging.jniLibs.excludes, Android--archvalues are validated against the bundled Python's supported ABIs, multiple--archvalues now correctly reachserious_python(comma-joined), and stale artifacts from previous builds are no longer copied into the output directory (#6567, #6578) by @ndonkoHenri.--arch,--source-packagesand--permissionsflags inflet buildkeeping only the values of the last occurrence (action="extend"on each) (#6578) by @ndonkoHenri.flet build apkfailing atmergeDebugNativeLibswithN files found with path 'lib/<abi>/libc++_shared.so'when an app combinesserious_python_androidwith another Flutter plugin that also bundles the NDK C++ runtime (#6570, #6571) by @ndonkoHenri.handlersignatures insubscribeandsubscribe_topicmethods ofPubSubClientfor better type checking (#6549) by @Iaw4tchFilePicker.pick_files()on web for slow network shares or slow machines: passcancel_upload_on_window_blur=Falseto prevent valid file selections from being reported as cancelled when the browser window loses focus during file picking (#771, #6573) by @ndonkoHenri.PagePlatform.ANDROID_TVinPage.get_device_info()retrieval (#6604) by @bl1nch.ProgressRing.year_2023being ignored, so the control correctly switches between the latest and 2023 Material Design appearances (#6614) by @ndonkoHenri.flet build ipa/iosapps that ship ctypes packages with plain.dylibshared libraries (e.g.llama-cpp-python) now load them on the iOS simulator instead of failing at launch with adlopenplatform mismatch (have 'iOS', need 'iOS-simulator'); the iOS runtime also now bundles the_multiprocessingextension (importable, not spawnable). Bumps the pinned bundle toserious_python4.2.1 / python-build20260701(serious_python#223) by @ndonkoHenri, @FeodorFitsner.ResponsiveRow(video players, WebViews, scroll positions) losing their state whenever a window resize crossed a breakpoint and the layout switched between a single row and wrapping (#6661, #6663) by @FeodorFitsner.Documentation
FilePicker.save_file()documentation: on desktop, passingsrc_byteswrites those bytes to the selected file (#6573) by @ndonkoHenri.v0.85.3Compare Source
Improvements
[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.[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.flet build webtemplate from0.27.5to0.27.7(includesmicropip0.9.0) (#6549) by @FeodorFitsner.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.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.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
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.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.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.v0.85.2Compare Source
New features
Route(modal=True)toflet.Routerfor fullscreen-dialog modal overlays that don't replace the underlying view stack — closing the modal pops it without rebuilding the views underneath. Two flavours by placement: top-level modals are global (the base stack is rebuilt from the Router's last non-modal location), nested-child modals are local (the base stack is the chain above the modal in the route tree, so deep-link works from URL alone) (#6516) by @FeodorFitsner.Route(recursive=True)toflet.Routerso a route can match itself as its own descendant — oneViewper consumed URL segment, ideal for tree-shaped URLs of unbounded depth (/folder/a/b/cproduces a 4-View stack; back-swipe walks one segment at a time). Non-recursive children are tried before self-recursion at every depth, so a specific sibling (e.g.example/:gp*) wins over the recursive:slugwithout duplicating it at every level (#6516) by @FeodorFitsner.Improvements
flet.Router's defaulton_view_popnow navigates to the matched chain's parent (chain[-2].resolved_path) instead ofviews[-2].route, which is robust against apps that share aView.routevalue between sibling tab roots to suppress switch transitions. Apps that install their ownpage.on_view_popbeforepage.render_views()still take precedence. Each sub-chain (base + modal) renders with its ownLocationInfo, sois_route_active(...)inside a base view sees the base URL while a global modal is open over it (#6516) by @FeodorFitsner.Bug fixes
sessionStorage-cloned_flet_session_id.REGISTER_CLIENTnow rejects session reuse when the existing session still has a liveconnection, allocating a fresh session for the second tab while preserving legitimate single-tab reconnect after refresh or network blip (whereconnectionis alreadyNone) (#6512, #6513) by @ihmily.v0.85.1Compare Source
Bug fixes
TooltipTheme.decorationso it applies to controls usingft.Tooltip(...)when the tooltip does not explicitly setdecorationorbgcolor(#6432, #6482) by @ndonkoHenri.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.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.0Compare Source
New features
flet-video;Video.take_screenshot()for capturing video frames; andVideo.on_position_change/Video.on_duration_changeevents (#6463) by @ndonkoHenri.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.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.scrollable,pin_leading_to_top, andpin_trailing_to_bottomproperties toNavigationRailfor scrollable content with optional pinned leading/trailing controls (#1923, #6356) by @ndonkoHenri.ResponsiveRowfor responsive layouts whose content exceeds the available height (#2590, #6417) by @ndonkoHenri.issuesproperty toCodeEditor(along withIssueandIssueTypetypes) for displaying code analysis error markers in the gutter, with analysis performed on the Python side (#6407) by @FeodorFitsner.Page.pop_views_until()to pop multiple views and return a result to the destination view (#6326, #6347) by @brunobrown.NavigationDrawerDestination.labelaccept custom controls and addNavigationDrawerTheme.icon_theme(#6379, #6395) by @ndonkoHenri.local_positionandglobal_positiontoDragTargetEventfor target-relative and global pointer coordinates (#6387, #6401) by @ndonkoHenri.AudioRecorder, includingon_streamchunks and direct upload support viaAudioRecorderUploadSettings(#5858, #6423) by @ndonkoHenri.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.Breaking changes
margin,padding,border, andborder_radiushelper functions (all(),symmetric(),only(),horizontal(),vertical()) in favor of the correspondingMargin,Padding,Border, andBorderRadiusclassmethods (#6425) by @ndonkoHenri.Deprecations
DragTargetEvent.x,DragTargetEvent.y, andDragTargetEvent.offset; uselocal_positionfor target-relative coordinates orglobal_positionfor global coordinates instead. These APIs are scheduled for removal in0.88.0(#6387, #6401) by @ndonkoHenri.Video.show_controls; setVideo.controlstoNoneto hide controls. This API is scheduled for removal in0.88.0(#6463) by @ndonkoHenri.Video.playlist_add()andVideo.playlist_remove(); mutateVideo.playlistdirectly with list methods such asappend()andpop(). These APIs are scheduled for removal in0.88.0(#6463) by @ndonkoHenri.Bug fixes
@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.PageandViewvertical centering when scrolling is enabled, including hidden scrollbars, so short content remains centered in the viewport (#6446, #6450) by @ndonkoHenri.flet_video.Videocontrols by linkingmedia_kitvideo apps against mimalloc in run and build flows (#6164, #6416) by @ndonkoHenri.flet buildandflet publishdependency parsing forproject.dependenciesand Poetry constraints with</<=, and add coverage for normalized requirement handling (#6332, #6340) by @td3447.CodeEditorbackground not filling the entire area whenexpand=True(#6407) by @FeodorFitsner.ResponsiveRowwith an explicit error, treat child controls withcol=0as hidden, and clarifyContainerexpansion behavior whenalignmentis set (#1951, #3805, #5209, #6354) by @ndonkoHenri.find_platform_imageselecting incompatible icon formats (e.g..icnson Windows) by ranking glob results per target platform (#6381) by @HG-ha.page.window.destroy()taking several seconds to close Windows desktop apps whenprevent_closeis enabled (#5459, #6428) by @ndonkoHenri.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.auto_scrollon scrollable controls silently doing nothing unlessscrollwas also explicitly set (#6397, #6404) by @ndonkoHenri.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.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.Page.on_resizeandPage.on_media_changenot firing after mobile orientation changes (#6457, #6423) by @ndonkoHenri.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.flet buildtemplate: inherit fromPlatform.environmentand useputIfAbsentfor FLET_* variables so pre-set system env vars are not overwritten (#6394) by @Bahtya.NavigationBarDestination.selected_iconrendering wrongly when provided as anIconcontrol (#6460, #6468) by @ndonkoHenri.#c00,#fc00) rendering as invisible by expanding them to their full 6/8-digit forms (#6419, #6421) by @ndonkoHenri.LineChartEvent.spotsreturning undecoded MessagePack extension values instead ofLineChartEventSpotobjects (#6443, #6468) by @ndonkoHenri.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.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.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.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
crocodocs watchcommand for hot-reload docs development with file-watching, debounced regeneration, and optional child process management (#6402) by @ndonkoHenri.Other changes
ReorderableListViewapp example showing add, remove, and reorder flows with stable item identity (#6374) by @FeodorFitsner.flet.utils.linux_depsand update CI workflows and publish docs to consume them dynamically (#6357, #6383) by @ndonkoHenri.serious_pythonto0.9.12in theflet buildtemplate (#6461) by @FeodorFitsner.v0.84.0Compare Source
Improvements
Bug fixes
flet packon macOS after the move to GitHub Releases by handling extracted app bundles, matching the cached tarball name, and cleaning up loose frameworks during packaging (#6358, #6361) by @FeodorFitsner.v0.83.1Compare Source
Bug fixes
local_delta.xandlocal_delta.yinstead of removeddelta_xanddelta_y(#6317, #6344) by @Krishnachaitanyakc.flet-datatable2on0.83.0(#6349, #6350) by @ndonkoHenri.v0.83.0Compare Source
New features
Configuration
📅 Schedule: (in timezone Europe/Berlin)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.