Repository navigation
chore: bump Flutter to 3.47.7 and render desktop with Impeller - #6916
Merged
Merged
Conversation
Xcode 27 fails builds whose macOS deployment target is below 12.0. The template and client pinned 11.0, and Flutter 3.44.8 generates the FlutterMacOS pod at 10.15. Raise the Podfile platform and the Xcode project to 12.0, and let pods below 12.0 inherit the platform, as Flutter 3.47's podhelper does.
Xcode 27 fails builds whose iOS deployment target is below 15.0. The template and client pinned 13.0, and Flutter 3.44.8 generates the Flutter pod at 13.0. Raise the Podfile platform and the Xcode project to 15.0, let pods below 15.0 inherit the platform, and drop the stale MinimumOSVersion that Flutter strips from AppFrameworkInfo.plist anyway.
Raising the deployment targets is a breaking change under the compatibility policy, so add a 1.0.4 breaking-change guide and register it in the index, the sidebar and the release notes. The release notes also gain the missing 1.0.1-1.0.3 entries. The macOS and iOS publish pages now state the minimum OS version, and the changelog entry links the guide.
Raising the minimum macOS and iOS versions drops support for macOS 11 and iOS 13-14, so it ships in the 1.1.0 minor release instead of the 1.0.4 patch, together with the Flutter 3.47 bump, whose engine requires the same minimums. Move the changelog entry to 1.1.0 and the breaking-change guide from v1-0-4 to v1-1-0, and update the breaking-changes index, the sidebar and the release notes. Flet 1.0.4 becomes the last release for macOS 11 and iOS 13-14.
Flutter 3.47 adds a migration that runs on every `flutter pub get`, `flutter test` and build. It inserts an `analyzer.exclude` block into the `analysis_options.yaml` of any package that depends on Flutter. On CI, `flutter test` in packages/flet would then leave a modified checked-in file, and `dart pub publish --dry-run` fails with exit code 65. Every release job depends on that step. Add the same block the migration writes, placed after `include:` the way Flutter's own app template does it: `build/**` for packages/flet, flet_integration_test and the extension packages, plus the six platform directories for the client and the `flet build` template. The migration only checks that each pattern is present, so it leaves these files alone afterwards. The excludes are valid on older SDKs too.
Flutter 3.47 replaces several exact SDK package pins with caret ranges. The client lock picks up the versions they now require: intl 0.20.3, matcher 0.12.20, meta 1.19.0, test_api 0.7.12 and vector_math 2.4.3.
On Flutter 3.47, flutter_additional_ios_build_settings and flutter_additional_macos_build_settings delete IPHONEOS_DEPLOYMENT_TARGET below 15 and MACOSX_DEPLOYMENT_TARGET below 12 from every pod, whether or not it depends on Flutter, so each pod inherits the Pods project value. The post_install clamps added for Xcode 27 on 3.44.8 now repeat that work and can go. Verified on Xcode 27 with clean client builds (macos --debug, ios --simulator --debug): every Pods target ends up at 12.0 / 15.0 and both builds succeed without FLUTTER_XCODE_* overrides. client/ios/Podfile.lock picks up the new Podfile checksum and the Flutter pod checksum, which changes because 3.47's generated Flutter podspec declares iOS 15.0.
Flutter 3.47 makes Impeller the default renderer on macOS, Windows and Linux. The Flet desktop client already opts out on macOS (FLTEnableImpeller=false, after blank windows on Intel Macs in #3557), but apps built with `flet build` and the Windows and Linux clients would switch to Impeller with the SDK bump. Upstream still has open Impeller issues on these platforms (flutter#185394 crash on foreground on macOS, flutter#191538 flicker on Intel Macs, flutter#191353 slower on Windows, flutter#192915 flicker in Linux VMs), and Impeller hasn't been tested with Flet on real Windows/Linux hardware. Keep every desktop lane on Skia, as on Flutter 3.44: - Windows client and template runner: set_impeller_switch(Disabled). - Linux client and template runner: fl_dart_project_set_enable_impeller. - macOS apps: flet-cli adds FLTEnableImpeller=false to the Info.plist defaults, so `[tool.flet.macos.info]` or `--info-plist FLTEnableImpeller=true` still switches a built app to Impeller. FLUTTER_ENGINE_SWITCHES=--enable-impeller still enables Impeller in debug builds. Release builds ignore that variable.
On iOS, Flutter 3.47 sets VoiceOver's header trait from the heading level, not from the header flag (flutter#186916). Android already did this, so both mobile screen readers now announce a heading only when `heading_level` is set. Describe that on `Semantics.heading_level` and `Semantics.header`. Flutter 3.47 also reports `high_contrast` on Android API 34+, not only on iOS (flutter#182263).
The Dart 3.13 linter reports use_super_parameters for this constructor. It was the only new analyzer diagnostic in packages/flet on Flutter 3.47.5. The behavior is unchanged: replacementString keeps the super constructor's '' default.
Flutter 3.47.5 raised its Android dependency floors: Gradle 8.14, AGP 8.11.1 and KGP 2.2.20, the versions both Android lanes pin, are now the lowest it accepts, and each build printed three "support will soon be dropped" warnings. The next Flutter release will likely reject them. Move the client and the `flet build` template to the newest combination that is supported end to end without AGP 9: - Gradle wrapper 9.3.1, Flutter's template default. - KGP 2.3.21. KGP 2.2.x is documented only up to Gradle 8.14, and Kotlin 2.4 class files need R8 9.1.29 or later. - AGP 8.13.2, the last 8.x release. Its bundled R8 8.13.19 is the minimum Google lists for Kotlin 2.3. With AGP 8.11.1 (R8 8.11.18) and Kotlin 2.4, R8 couldn't parse Kotlin metadata and printed a warning per class whenever kotlin.Metadata was kept. Flutter 3.47.5's AGP/Gradle and AGP/KGP compatibility checks accept this combination. AGP 9 isn't usable yet: file_picker 11 and device_info_plus 12.4 fail to build with either android.builtInKotlin setting. Only the AGP warning remains. Gradle 9.1+ also runs on JDK 25, which crashed Gradle 8.14 with "IllegalArgumentException: 25.0.2". Verified: client `flutter build apk --debug` and `--release` (R8 8.13.19, no Kotlin metadata warnings), and `./gradlew assembleDebug` on JDK 25.
On Flutter 3.47, a custom build template no longer needs the Podfile post_install step: Flutter's migrators raise the deployment targets of the generated project during the build, and podhelper.rb drops lower targets from every pod. Custom templates keep building on Xcode 27, and the Podfile `platform` and project.pbxproj changes only remove that migration step. Staying on macOS 11 or iOS 13-14 needs Flet 1.0.4 or earlier, because the Flutter 3.47 engine itself requires macOS 12 and iOS 15.
ndonkoHenri
added this pull request to stack #6917
October 4, 2026 22:23
Deploying flet-website-v2 with
|
| Latest commit: |
3704d8a
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://e5c435ec.flet-website-v2.pages.dev |
| Branch Preview URL: | https://chore-bump-flutter-3-47-5.flet-website-v2.pages.dev |
… into chore/bump-flutter-3.47.5
The "Picking files with a client action" section sat between the Usage intro and its "Uploading files" and "Upload storage" subsections, so both rendered as children of the client-action section. Move it to just before Examples, where the Clipboard, Share and UrlLauncher pages put theirs. The "Pick and upload files" and "Pick text content" examples kept hand-written headings and intros, which duplicated the headings the remark plugin injects from each example's metadata, and the intros rendered above the injected heading. Move the intros into `docs_intro` and drop the hand-written headings.
`Path.QuadraticTo` defaults `w` to 1 in Python, and the serializer omits a field that equals its default, so a plain quadratic curve reaches the client without `w`. The Dart side fell back to a weight of 0. A conic with weight 0 is a straight line between its end points. Flutter 3.44 measured and dashed such conics as curves anyway, but Flutter 3.47 handles them correctly, so dashed paths built from `QuadraticTo` lost their curves (`test_draw_dashed_path_with_fill` dropped to 87.9% similarity). Fall back to 1, the same default as Python.
Kotlin Gradle plugin 2.3 compiles through the Build Tools API by default (`kotlin.compiler.runViaBuildToolsApi` defaults to true; it was false in 2.2.20). Its incremental cache stores every source path relative to the Android project. On Windows, when the pub cache and the app sit on different drives (C: and D: on GitHub's Windows runners), there is no relative path. Compiling a plugin such as battery_plus then fails with "Could not close incremental caches ... this and base files have different roots", which broke every apk-windows and aab-windows job. Set `kotlin.incremental=false` in the client and in flet-cli's default gradle.properties for generated projects. The plugin modules are small and Gradle still skips unchanged ones, so builds barely slow down. `[tool.flet.android.gradle_properties]` can turn it back on.
Desktop apps and the flet run client now use Flutter 3.47's default renderer, Impeller. The client and template runners switch to Skia when FLET_NO_IMPELLER is true at startup; release engines ignore Flutter's own engine-switch variables, and on macOS the runner replaces the private FlutterDartProject.enableImpeller getter only when asked. flet run --no-impeller (or impeller = false in pyproject) sets the variable for the client it opens. flet build/debug/test get --impeller/--no-impeller with [tool.flet(.<platform>)].impeller: the template runners bake it in on Windows and Linux, macOS gets FLTEnableImpeller=false and Android the EnableImpeller=false meta-data. Integration tests keep rendering with Skia until the goldens are regenerated.
3.47.6 fixes Windows release apps hanging while waiting on a timer (flutter/flutter#192513) and moves to Dart 3.13.5. The client lock and the generated icon lists don't change.
… into chore/bump-flutter-3.47.5
…ployment-targets # Conflicts: # CHANGELOG.md # website/docs/updates/release-notes.md
…r-3.47.5 # Conflicts: # CHANGELOG.md # client/pubspec.lock # packages/flet/CHANGELOG.md
Flutter 3.47's AnalysisOptionsMigration writes this block on every pub get, as for the other extensions in this branch.
Flutter 3.47 shows a text field's context menu in the root overlay without the themes between the field and the Navigator. flet_shadcn_ui provides its ShadTheme only around each control, so right-clicking or long-pressing an Input, Textarea, InputOTP or TimePicker threw "ShadTheme.of() called with a context that does not contain a ShadTheme" and covered the window with an error box. Input and Textarea build shadcn_ui's menu inside the field's ShadTheme. InputOTP and TimePicker take no contextMenuBuilder, so their native menu is turned off.
Regenerating the lock after the merge had moved flutter_shaders and theme_extensions_builder_annotation, which Flutter 3.47 doesn't require.
ndonkoHenri
removed this pull request from stack #6917
October 8, 2026 22:00
ndonkoHenri
added this pull request to stack #6934
October 8, 2026 22:01
FeodorFitsner
approved these changes
Oct 9, 2026
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.
Builds on the merged #6914 and targets
flet-1.1.0. Both ship in Flet 1.1.0.Summary
This bumps the bundled Flutter from 3.44.8 to 3.47.7 and makes desktop apps render with Impeller, Flutter 3.47's default, with a
--no-impelleropt-out.The pin is 3.47.7 rather than an earlier 3.47:
Actions.handlerreturns null, which affectsMenuItemButton. Xcode 27 debug launches can hang on a white screen. Debugging on iOS 27 devices crashes.The Dart code needs no API changes. The earlier SDK migration required no framework API replacements. Material and Cupertino are frozen upstream, and all Dart packages analyze with no new errors or warnings.
Changes
.fvmrc→ 3.47.7. Flutter 3.47 replaced several exact SDK package pins with caret ranges, soclient/pubspec.lockmoves intl, matcher, meta, test_api and vector_math.analysis_options.yaml(21 files, including theflet-shadcn-uiextension fromflet-1.1.0):AnalysisOptionsMigrationthat writes ananalyzer.excludeblock on everyflutter pub get/flutter test. This PR pre-applies the same block.flutter testleavespackages/fletwith a modified file, and CI'sdart pub publish --dry-runexits 65. Every release job depends on that step.post_installdeployment-target clamps from fix(build): raise macOS and iOS deployment targets for Xcode 27 #6914. Flutter 3.47'spodhelper.rbnow deletesIPHONEOS_DEPLOYMENT_TARGET< 15 andMACOSX_DEPLOYMENT_TARGET< 12 from every pod.client/ios/Podfile.lockpicks up the new Podfile checksum and the Flutter pod checksum. The pod changes because its generated podspec now declares iOS 15.FLTEnableImpeller=false(added after Blank Screen on Mac Intel #3557) is removed.FLUTTER_ENGINE_SWITCHES, so the client and template runners read a Flet variable,FLET_NO_IMPELLER(true/1/yes), at startup and switch to Skia:set_impeller_switch(ImpellerSwitch::Disabled), through a newIsEnvironmentVariableTruehelper.fl_dart_project_set_enable_impeller(project, FALSE). It also does this whenFLUTTER_LINUX_RENDERER=software, because the software renderer aborts on Impeller text.FLTEnableImpellerInfo.plist key, so the runner replaces the private-[FlutterDartProject enableImpeller]getter, and only when the variable is set. SubclassingFlutterDartProjectinstead would move its ICU data lookup to the app bundle and break word boundaries.flet run --no-impeller(orimpeller = falseunder[tool.flet]/[tool.flet.<os>]) sets the variable for the client it opens.flet build/debug/test --impeller/--no-impeller, with[tool.flet].impellerand a[tool.flet.<platform>]override:FLTEnableImpeller=falsein Info.plist.io.flutter.embedding.android.EnableImpeller=falsemeta-data.FLET_NO_IMPELLERat startup, so users can fall back without a rebuild.conftest.pyfiles defaultFLET_NO_IMPELLER=1, because the goldens were rendered with Skia.Navigator(Fix SelectableText crash with inline lambda contextMenuBuilder flutter/flutter#184990). The extension provides itsShadThemeonly around each control, so right-clicking or long-pressing an Input, Textarea, InputOTP or TimePicker threw "ShadTheme.of() called with a context that does not contain a ShadTheme" and covered the window with an error box.ShadTheme.contextMenuBuilder, so their native menu is off.kotlin.incremental=falsein the client and in flet-cli's defaultgradle.propertiesfor generated projects. KGP 2.3 compiles through the Build Tools API by default, and its incremental cache fails on Windows when the pub cache and the app are on different drives, as on GitHub's Windows runners.[tool.flet.android.gradle_properties]can turn it back on.QuadraticToweight to 1, as Python does. It fell back to 0, a conic that is a straight line; Flutter 3.44 still dashed it as a curve, but 3.47 handles it correctly, so dashed paths built fromQuadraticTolost their curves.FLET_NO_IMPELLERenvironment variable, Windows and Linux troubleshooting rows, and the macOS Info.plist and Android meta-data resolution orders.Semantics.heading_level/header: on iOS, VoiceOver's header trait now comes from the heading level (iOS a11y sets header trait based on heading level flutter/flutter#186916).SemanticsService.high_contrast: the list of platforms that report it is corrected.textfield.dart: super parameters, the only new analyzer diagnostic on Dart 3.13.Testing
Environment: macOS 27 / Xcode 27.0, JDK 17 unless noted. The results below were recorded on Flutter 3.47.5 and the previous patch pin. These builds and runtime tests have not been rerun on 3.47.7.
flutter testpasses (91 on the previous patch pin). Thendart pub publish --dry-runexits 0 on a clean tree; without theanalysis_options.yamlchange it exits 65.flutter pub get+dart analyzeloop exits 0, and no files are rewritten.flutter build macos --debug,flutter build ios --simulator --debug, andflutter build apk --debugand--releasesucceed with noFLUTTER_XCODE_*overrides../gradlew assembleDebugsucceeds on JDK 25.FLET_NO_IMPELLERunset or0, it logsUsing the Impeller rendering backend (MetalSDF).1orTRUE, it logsUsing the Skia rendering backend (Metal). This also holds when it is launched throughopen -n, asflet rundoes.icudtl.daterrors.flet buildfrom the in-repo template:FLTEnableImpellerkey and renders with Impeller, or with Skia whenFLET_NO_IMPELLER=1. A--no-impellerbuild hasFLTEnableImpeller=falseand renders with Skia. The rendered Windows and Linux runners and the Android manifest carry the expected values.flet_build_test, all extensions except flet-shadcn-ui, which came withflet-1.1.0): the app renders in the simulator. Flutter migrates the template to the UIScene lifecycle at build time.generate_icons.py --verifyagainst the previous patch pin reports 0 failures, including flet-shadcn-ui's Lucide set.ShadThemeerror in all 8 cases before the fix and in none after. Input and Textarea show their copy/paste menu.kotlin.Metadataprints 24 R8 "kotlin metadata" warnings on AGP 8.11.1 + KGP 2.4.0, and none on AGP 8.13.2 + KGP 2.3.21.yarn buildpasses with no broken links or anchors.Not covered locally:
flet testworkflow now runs the counter app with Impeller on Windows and Linux runners.conftest.pydefault).Follow-ups
FLET_NO_IMPELLERdefault from theconftest.pyfiles.Summary by Sourcery
Upgrade Flet to Flutter 3.47.7 and make Impeller the default renderer while providing configurable Skia fallbacks across supported platforms.
New Features:
Bug Fixes:
Enhancements:
Build:
Documentation:
Tests:
Chores: