From 95a72dc1fa9ca5797399cd3c81ee95a9fb8cb8e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 05:18:38 -0700 Subject: [PATCH 01/28] Bump github/codeql-action from 4.35.3 to 4.35.4 in the github-actions group (#13375) Bumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 4.35.3 to 4.35.4
Release notes

Sourced from github/codeql-action's releases.

v4.35.4

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=4.35.3&new-version=4.35.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3cbeb35f76..c47bd4646b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@e46ed2cbd01164d986452f91f178727624ae40d7 + uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -44,7 +44,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@e46ed2cbd01164d986452f91f178727624ae40d7 + uses: github/codeql-action/autobuild@68bde559dea0fdcac2102bfdf6230c5f70eb485e # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -58,4 +58,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@e46ed2cbd01164d986452f91f178727624ae40d7 + uses: github/codeql-action/analyze@68bde559dea0fdcac2102bfdf6230c5f70eb485e From 593b5f0510b750fb22cd60fc6fc06c0acc3342c4 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Fri, 8 May 2026 05:19:34 -0700 Subject: [PATCH 02/28] Add redirect for overlay-semantics documentation (#13374) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _Description of what this PR is changing or adding, and why:_ _Issues fixed by this PR (if any):_ _PRs or commits this PR depends on (if any):_ ## Presubmit checklist - [ ] If you are unwilling, or unable, to sign the CLA, even for a _tiny_, one-word PR, please file an issue instead of a PR. - [ ] If this PR is not meant to land until a future stable release, mark it as draft with an explanation. - [ ] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style)—for example, it doesn't use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first-person pronouns). - [ ] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --- firebase.json | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase.json b/firebase.json index 856c9f28d3..1c35e1849e 100644 --- a/firebase.json +++ b/firebase.json @@ -638,6 +638,7 @@ { "source": "/go/optimized-platform-view-layers", "destination": "https://docs.google.com/document/d/1YHwVz7-F03psEzHxByGka_lIFaDV5K90BJMbNxQeK4k/edit?resourcekey=0-n4_VcUnMU-99sjJ6C1_Ycw#", "type": 301 }, { "source": "/go/os-adaptive-shortcut-activator", "destination": "https://docs.google.com/document/d/11NWj13MSDw1XQg4MpYIeqzcCFGuzQ_Cz7tYXW7fqzPY/edit?usp=sharing", "type": 301 }, { "source": "/go/outline-input-border-padding-fix", "destination": "https://docs.google.com/document/d/1QBM5oM9qPWVeFSPSqpXOFbdXV9dH9A9ABKsNMs1J2XU/edit?usp=sharing", "type": 301 }, + { "source": "/go/overlay-semantics", "destination": "https://docs.google.com/document/d/1XfHWGTmt_w4N7r3H1ag53MiYZME0VKseT3D6XaOCZKM/edit?usp=sharing", "type": 301 }, { "source": "/go/overridable-text-actions", "destination": "https://docs.google.com/document/d/11vmEZTjB4_E4el1IjTo2VBI2d_fR7tjQWeCajsQc-q4/edit?usp=sharing", "type": 301 }, { "source": "/go/package-release-strategy", "destination": "https://docs.google.com/document/d/18kjoP-4LAXEllugVOQRg6vZELyD6MuxlKilLD4lFxSY/edit?usp=sharing", "type": 301 }, { "source": "/go/packaged-ai-assets", "destination": "https://docs.google.com/document/d/1k_X-Sp4GQyZP6k9lvZ1Itj0GvzQZuWl3iKzi5AIa69Q/edit?usp=sharing", "type": 301 }, From 63981f25c092a947753b35483dfa76f26fcc1133 Mon Sep 17 00:00:00 2001 From: Reid Baker <1063596+reidbaker@users.noreply.github.com> Date: Mon, 11 May 2026 15:05:24 -0400 Subject: [PATCH 03/28] Inital example of a bare skill that gives contributors their installed mcp servers but only the skills that have been vetted (#13376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @gaaclarke was frustrated by a skill that was triggered when he didnt want or expect. Full context in go/flutter-website-skills-frustration-chat We could fix that specific skill but that does not remove the class of issue, what to do when skills are triggering and making you work more complicated. Until we have resolver style tests that can regression test false positive activations then a custom agent can be a work around in the moment and as a pattern. Screenshot 2026-05-08 at 7 06 05 PM ## Presubmit checklist - [x] If you are unwilling, or unable, to sign the CLA, even for a _tiny_, one-word PR, please file an issue instead of a PR. - [ ] If this PR is not meant to land until a future stable release, mark it as draft with an explanation. - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style)—for example, it doesn't use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first-person pronouns). - [x] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --- .agents/agents/bare-agent/agent.json | 7 +++++++ .agents/agents/bare-agent/config.yaml | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 .agents/agents/bare-agent/agent.json create mode 100644 .agents/agents/bare-agent/config.yaml diff --git a/.agents/agents/bare-agent/agent.json b/.agents/agents/bare-agent/agent.json new file mode 100644 index 0000000000..08178a6fa6 --- /dev/null +++ b/.agents/agents/bare-agent/agent.json @@ -0,0 +1,7 @@ +{ + "name": "bare-agent", + "description": "An agent that only inherits MCP servers and only includes proven reliable skills.", + "configPath": { + "relativePathToConfig": "config.yaml" + } +} diff --git a/.agents/agents/bare-agent/config.yaml b/.agents/agents/bare-agent/config.yaml new file mode 100644 index 0000000000..356ccf36e8 --- /dev/null +++ b/.agents/agents/bare-agent/config.yaml @@ -0,0 +1,9 @@ +coding_agent: + agentic_mode: true + google_mode: false + +customization_config: + customization_discovery_config: + skills: + inherit_user: false + skills_paths: [] From c63034dad2738e18d4f3a0c88487410179395f3a Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 12 May 2026 01:52:19 +0200 Subject: [PATCH 04/28] Fix a variety of spelling, grammar, and punctuation issues (#13378) --- .../migrate-swift-plugin.md | 2 +- .../add-to-app/android/add-flutter-view.md | 2 +- .../ai/ai-toolkit/feature-integration.md | 2 +- .../src/content/ai/gemini-cli-extension.md | 2 +- .../app-architecture/case-study/ui-layer.md | 13 ++--- .../src/content/app-architecture/concepts.md | 6 +-- .../animation/page-route-animation.md | 6 +-- .../content/cookbook/design/orientation.md | 4 +- sites/docs/src/content/deployment/cd.md | 4 +- .../src/content/deployment/flavors-ios.md | 6 +-- sites/docs/src/content/deployment/flavors.md | 2 +- .../docs/src/content/deployment/obfuscate.md | 2 +- .../docs/src/content/flutter-for/web-devs.md | 2 +- .../content/packages-and-plugins/favorites.md | 2 +- sites/docs/src/content/perf/isolates.md | 2 +- sites/docs/src/content/perf/ui-performance.md | 4 +- .../platform-integration/android/c-interop.md | 2 +- .../android/compose-activity.md | 47 +++++++------------ .../platform-integration/ios/c-interop.md | 4 +- .../platform-integration/macos/c-interop.md | 2 +- .../platform-integration/web/web-images.md | 4 +- .../breaking-changes/3-13-deprecations.md | 4 +- .../breaking-changes/3-7-deprecations.md | 2 +- .../android-java-gradle-migration-guide.md | 2 +- .../release/breaking-changes/buttons.md | 2 +- .../editable-text-focus-attachment.md | 2 +- .../flutter-root-version-file.md | 2 +- .../image-provider-load-buffer.md | 4 +- .../content/release/breaking-changes/index.md | 2 +- .../material-chip-button-semantics.md | 4 +- .../modal-router-semantics-order.md | 8 ++-- .../breaking-changes/multi-touch-scrolling.md | 2 +- .../network-policy-ios-android.md | 2 +- .../breaking-changes/renderbox-dry-layout.md | 4 +- .../system_context_menu_controller_show.md | 4 +- .../breaking-changes/uiscenedelegate.md | 4 +- .../breaking-changes/web-golden-comparator.md | 2 +- sites/docs/src/content/release/whats-new.md | 4 +- .../src/content/resources/ads-overview.md | 4 +- .../resources/in-app-purchases-overview.md | 2 +- .../docs/src/content/testing/common-errors.md | 2 +- sites/docs/src/content/tools/antigravity.md | 2 +- .../content/tools/devtools/cpu-profiler.md | 10 ++-- .../src/content/tools/devtools/inspector.md | 2 +- .../tools/devtools/legacy-inspector.md | 2 +- .../release-notes/release-notes-2.28.5.md | 2 +- sites/docs/src/content/tools/hot-reload.md | 2 +- sites/docs/src/content/tools/pubspec.md | 2 +- .../ui/adaptive-responsive/more-info.md | 2 +- .../content/ui/assets/asset-transformation.md | 2 +- .../src/content/ui/interactivity/focus.md | 2 +- .../content/ui/internationalization/index.md | 4 +- 52 files changed, 101 insertions(+), 113 deletions(-) diff --git a/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md b/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md index 2bdfa40cc5..d0f5dc223c 100644 --- a/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md +++ b/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md @@ -269,7 +269,7 @@ The example below uses `ios`, replace `ios` with `macos`/`darwin` as applicable. :::note `Bundle.module` only works if there are resources [defined in the `Package.swift` file][Bundling resources] or - [automatically included by Xcode][Xcode resource detection]). + [automatically included by Xcode][Xcode resource detection]. Otherwise, using `Bundle.module` results in an error. ::: diff --git a/sites/docs/src/content/add-to-app/android/add-flutter-view.md b/sites/docs/src/content/add-to-app/android/add-flutter-view.md index fbdb61a0b5..a66bbc1875 100644 --- a/sites/docs/src/content/add-to-app/android/add-flutter-view.md +++ b/sites/docs/src/content/add-to-app/android/add-flutter-view.md @@ -95,7 +95,7 @@ system UI overlay, plugins, and so on. ## Content-sized views Usually, a [`FlutterView`]({{site.api}}/javadoc/io/flutter/embedding/android/FlutterView.html) -needs fixed dimensions either through it's own dimensions or by matching a +needs fixed dimensions either through its own dimensions or by matching a parent's dimensions. This can be seen in the [sample project]({{site.repo.samples}}/tree/main/add_to_app/android_view/android_view). However, it's now possible to allow `FlutterView` to size itself based on its content. By using, `content_wrap` for either the height diff --git a/sites/docs/src/content/ai/ai-toolkit/feature-integration.md b/sites/docs/src/content/ai/ai-toolkit/feature-integration.md index 8a0d0a5a73..3bbc4b0c88 100644 --- a/sites/docs/src/content/ai/ai-toolkit/feature-integration.md +++ b/sites/docs/src/content/ai/ai-toolkit/feature-integration.md @@ -440,7 +440,7 @@ LlmChatView( ), ``` -In this particular example, the `RecipeReponseView` widget is constructed with +In this particular example, the `RecipeResponseView` widget is constructed with the LLM provider's response text and uses that to implement its `build` method: ```dart diff --git a/sites/docs/src/content/ai/gemini-cli-extension.md b/sites/docs/src/content/ai/gemini-cli-extension.md index c582398711..1063681550 100644 --- a/sites/docs/src/content/ai/gemini-cli-extension.md +++ b/sites/docs/src/content/ai/gemini-cli-extension.md @@ -71,7 +71,7 @@ extension for Gemini CLI by using one of the following commands: ``` 2. To install the current version and ensure that future - updates are automatically installed, use the `auto-upate` tag: + updates are automatically installed, use the `auto-update` tag: ```console gemini extensions install https://github.com/gemini-cli-extensions/flutter.git --auto-update diff --git a/sites/docs/src/content/app-architecture/case-study/ui-layer.md b/sites/docs/src/content/app-architecture/case-study/ui-layer.md index b9fc35d63d..e94e91766e 100644 --- a/sites/docs/src/content/app-architecture/case-study/ui-layer.md +++ b/sites/docs/src/content/app-architecture/case-study/ui-layer.md @@ -228,13 +228,18 @@ class HomeViewModel extends ChangeNotifier { `ChangeNotifier` and [`ListenableBuilder`][] (discussed later on this page) are part of the Flutter SDK, and provide a good solution for updating the UI when state changes. -You can also use a robust third-party state management solution, -such as [package:riverpod][], [package:flutter_bloc][], or [package:signals][]. +You can also use a robust third-party state management solution, such as +[`package:riverpod`][], [`package:flutter_bloc`][], or [`package:signals`][]. These libraries offer different tools for handling UI updates. Read more about using `ChangeNotifier` in our [state-management documentation][]. ::: +[`package:riverpod`]: {{site.pub-pkg}}/riverpod +[`package:flutter_bloc`]: {{site.pub-pkg}}/flutter_bloc +[`package:signals`]: {{site.pub-pkg}}/signals +[state-management documentation]: /data-and-backend/state-mgmt/intro + ## Define a view A view is a widget within your app. @@ -639,7 +644,6 @@ the Command pattern. [Read about it on GitHub][]. [`Listenable`]: {{site.api}}/flutter/foundation/Listenable-class.html [`ListenableBuilder`]: {{site.api}}/flutter/widgets/ListenableBuilder-class.html [`notifyListeners`]: {{site.api}}/flutter/foundation/ChangeNotifier/notifyListeners.html -[state-management documentation]: /data-and-backend/state-mgmt/intro [`Scaffold`]: {{site.api}}/flutter/material/Scaffold-class.html [`Dismissible`]: {{site.api}}/flutter/widgets/Dismissible-class.html [`utils` directory]: https://github.com/flutter/samples/blob/main/compass_app/app/lib/utils/command.dart @@ -648,9 +652,6 @@ the Command pattern. [Read about it on GitHub][]. [`StreamBuilders`]: {{site.api}}/flutter/widgets/StreamBuilder-class.html [`AsyncSnapshot`]: {{site.api}}/flutter/widgets/AsyncSnapshot-class.html [Read about it on GitHub]: https://github.com/flutter/samples/pull/2449#pullrequestreview-2328333146 -[package:riverpod]: {{site.pub-pkg}}/riverpod -[package:flutter_bloc]: {{site.pub-pkg}}/flutter_bloc -[package:signals]: {{site.pub-pkg}}/signals ## Feedback diff --git a/sites/docs/src/content/app-architecture/concepts.md b/sites/docs/src/content/app-architecture/concepts.md index 5939b49070..76067a4a6d 100644 --- a/sites/docs/src/content/app-architecture/concepts.md +++ b/sites/docs/src/content/app-architecture/concepts.md @@ -44,9 +44,9 @@ into 2 to 3 layers, depending on complexity. * **UI layer** - Displays data to the user that is exposed by the business logic layer, and handles user interaction. This is also commonly referred to as the - ‘presentation layer'. + "presentation layer". * **Logic layer** - Implements core business logic, and facilitates interaction - between the data layer and UI layer. Commonly known as the ‘domain layer'. + between the data layer and UI layer. Commonly known as the "domain layer". The logic layer is optional, and only needs to be implemented if your application has complex business logic that happens on the client. Many apps are only concerned with presenting data to a user and @@ -55,7 +55,7 @@ into 2 to 3 layers, depending on complexity. * **Data layer** - Manages interactions with data sources, such as databases or platform plugins. Exposes data and methods to the business logic layer. -These are called ‘layers' because each layer can only communicate with the +These are called "layers" because each layer can only communicate with the layers directly below or above it. The UI layer shouldn't know that the data layer exists, and vice versa. diff --git a/sites/docs/src/content/cookbook/animation/page-route-animation.md b/sites/docs/src/content/cookbook/animation/page-route-animation.md index 3b4306152d..817926dc67 100644 --- a/sites/docs/src/content/cookbook/animation/page-route-animation.md +++ b/sites/docs/src/content/cookbook/animation/page-route-animation.md @@ -93,7 +93,7 @@ class Page2 extends StatelessWidget { To make the new page animate in from the bottom, it should animate from `Offset(0,1)` to `Offset(0, 0)` (usually defined using the `Offset.zero` constructor). In this case, the Offset is a 2D vector for the -['FractionalTranslation'][] widget. +[`FractionalTranslation`][] widget. Setting the `dy` argument to 1 represents a vertical translation one full height of the page. @@ -117,7 +117,7 @@ transitionsBuilder: (context, animation, secondaryAnimation, child) { Flutter has a set of widgets extending [`AnimatedWidget`][] that rebuild themselves when the value of the animation changes. For instance, SlideTransition takes an `Animation` and translates its child (using a -FractionalTranslation widget) whenever the value of the animation changes. +`FractionalTranslation` widget) whenever the value of the animation changes. AnimatedWidget Return a [`SlideTransition`][] with the `Animation` and the child widget: @@ -274,7 +274,7 @@ class Page2 extends StatelessWidget { [`Curve`]: {{site.api}}/flutter/animation/Curve-class.html [`Curves`]: {{site.api}}/flutter/animation/Curves-class.html [`CurveTween`]: {{site.api}}/flutter/animation/CurveTween-class.html -['FractionalTranslation']: {{site.api}}/flutter/widgets/FractionalTranslation-class.html +[`FractionalTranslation`]: {{site.api}}/flutter/widgets/FractionalTranslation-class.html [`PageRouteBuilder`]: {{site.api}}/flutter/widgets/PageRouteBuilder-class.html [`Route`]: {{site.api}}/flutter/widgets/Route-class.html [`SlideTransition`]: {{site.api}}/flutter/widgets/SlideTransition-class.html diff --git a/sites/docs/src/content/cookbook/design/orientation.md b/sites/docs/src/content/cookbook/design/orientation.md index b67871801e..ab44403b5d 100644 --- a/sites/docs/src/content/cookbook/design/orientation.md +++ b/sites/docs/src/content/cookbook/design/orientation.md @@ -12,7 +12,7 @@ the screen from portrait mode to landscape mode. For example, the app might show one item after the next in portrait mode, yet put those same items side-by-side in landscape mode. Expanded docs covering this and more can be found -in the [adaptive ui documenation][]. +in the [adaptive ui documentation][]. In Flutter, you can build different layouts depending on a given [`Orientation`][]. @@ -171,5 +171,5 @@ void main() { [`OrientationBuilder`]: {{site.api}}/flutter/widgets/OrientationBuilder-class.html [`Orientation`]: {{site.api}}/flutter/widgets/Orientation.html [`SystemChrome.setPreferredOrientations()`]: {{site.api}}/flutter/services/SystemChrome/setPreferredOrientations.html -[adaptive ui documenation]: {{site.api}}/ui/adaptive-responsive +[adaptive ui documentation]: {{site.api}}/ui/adaptive-responsive [discouraged]: {{site.api}}/ui/adaptive-responsive/best-practices diff --git a/sites/docs/src/content/deployment/cd.md b/sites/docs/src/content/deployment/cd.md index 94b2656c1a..cf29e6fe13 100644 --- a/sites/docs/src/content/deployment/cd.md +++ b/sites/docs/src/content/deployment/cd.md @@ -24,7 +24,7 @@ options available to help automate the delivery of your application. You can use fastlane with the following tooling: * [GitHub Actions][] - * Example: [Github Action in Flutter Project][] + * Example: [GitHub Action in Flutter Project][] * [Cirrus][] * [Travis][] * [GitLab][] @@ -315,7 +315,7 @@ information. [fastlane Android beta deployment guide]: https://docs.fastlane.tools/getting-started/android/beta-deployment/ [fastlane CI documentation]: https://docs.fastlane.tools/best-practices/continuous-integration [fastlane iOS beta deployment guide]: https://docs.fastlane.tools/getting-started/ios/beta-deployment/ -[Github Action in Flutter Project]: {{site.github}}/nabilnalakath/flutter-githubaction +[GitHub Action in Flutter Project]: {{site.github}}/nabilnalakath/flutter-githubaction [GitHub Actions]: {{site.github}}/features/actions [GitLab]: https://docs.gitlab.com/ee/ci/ [CircleCI]: https://circleci.com diff --git a/sites/docs/src/content/deployment/flavors-ios.md b/sites/docs/src/content/deployment/flavors-ios.md index 1a008cac7a..6dcc4df21e 100644 --- a/sites/docs/src/content/deployment/flavors-ios.md +++ b/sites/docs/src/content/deployment/flavors-ios.md @@ -557,10 +557,10 @@ To learn about them, see For more information on creating and using flavors, check out the following resources: -* [How to Setup Flutter & Firebase with Multiple Flavors - using the FlutterFire CLI][flutterfireCLI] +* [How to set up Flutter & Firebase with Multiple Flavors + using the FlutterFire CLI][flutterfire-cli] * [Build flavors in Flutter (Android and iOS) with different Firebase projects per flavor Flutter Ready to Go][flavors-firebase] -[flutterfireCLI]: https://codewithandrea.com/articles/flutter-firebase-multiple-flavors-flutterfire-cli/ +[flutterfire-cli]: https://codewithandrea.com/articles/flutter-firebase-multiple-flavors-flutterfire-cli/ [flavors-firebase]: {{site.medium}}/@animeshjain/build-flavors-in-flutter-android-and-ios-with-different-firebase-projects-per-flavor-27c5c5dac10b diff --git a/sites/docs/src/content/deployment/flavors.md b/sites/docs/src/content/deployment/flavors.md index 512ae345eb..1d0b6cc338 100644 --- a/sites/docs/src/content/deployment/flavors.md +++ b/sites/docs/src/content/deployment/flavors.md @@ -280,7 +280,7 @@ names for two product flavors called `staging` and * To see more information for `Flavors p...` or `Flavors s...`, long-press the icon for one of them - and and select `App info`. + and select `App info`. [Launch a flavor]: #launching-your-app-flavors diff --git a/sites/docs/src/content/deployment/obfuscate.md b/sites/docs/src/content/deployment/obfuscate.md index 4e0816c9ef..0316b9b8de 100644 --- a/sites/docs/src/content/deployment/obfuscate.md +++ b/sites/docs/src/content/deployment/obfuscate.md @@ -95,7 +95,7 @@ app in the future, you will need the symbol map. 1. Once you've obfuscated your binary, **backup the SYMBOLS file**. You might need this if you lose - your original SYMBOLs file and you + your original SYMBOLS file and you want to de-obfuscate a stack trace. ## Read an obfuscated stack trace diff --git a/sites/docs/src/content/flutter-for/web-devs.md b/sites/docs/src/content/flutter-for/web-devs.md index b8802584b0..1a2929f632 100644 --- a/sites/docs/src/content/flutter-for/web-devs.md +++ b/sites/docs/src/content/flutter-for/web-devs.md @@ -13,7 +13,7 @@ It maps HTML/CSS code snippets to their Flutter/Dart code equivalents. Flutter is a framework for building cross-platform applications that uses the Dart programming language. To understand some differences between programming with Dart -and programming with Javascript, +and programming with JavaScript, see [Learning Dart as a JavaScript Developer][]. One of the fundamental differences between diff --git a/sites/docs/src/content/packages-and-plugins/favorites.md b/sites/docs/src/content/packages-and-plugins/favorites.md index 714b4c0b8e..39e761e347 100644 --- a/sites/docs/src/content/packages-and-plugins/favorites.md +++ b/sites/docs/src/content/packages-and-plugins/favorites.md @@ -39,7 +39,7 @@ using the following metrics: * Good **runtime behavior** in terms of CPU and memory usage * High quality **dependencies** -## Flutter Ecosystem Committee +## Flutter Ecosystem Committee The Flutter Ecosystem Committee is comprised of Flutter team members and Flutter community members spread diff --git a/sites/docs/src/content/perf/isolates.md b/sites/docs/src/content/perf/isolates.md index 94e2313963..19b886ddcf 100644 --- a/sites/docs/src/content/perf/isolates.md +++ b/sites/docs/src/content/perf/isolates.md @@ -223,7 +223,7 @@ in which the `StreamController` or `Sink` is created in one isolate, and the listener is set up in the other isolate. In this analogy, -the `StreamConroller` is called a `SendPort`, +the `StreamController` is called a `SendPort`, and you can "add" messages with the `send()` method. `ReceivePort`s are the listeners, and when these listeners receive a new message, diff --git a/sites/docs/src/content/perf/ui-performance.md b/sites/docs/src/content/perf/ui-performance.md index 1e5dabbd6b..745b0a297a 100644 --- a/sites/docs/src/content/perf/ui-performance.md +++ b/sites/docs/src/content/perf/ui-performance.md @@ -361,12 +361,12 @@ Flutter's tools and debugging in Flutter: * [Why Flutter uses Dart][video], a video on the Flutter channel * [DevTools][devtools]: performance tooling for Dart and Flutter apps * [Flutter API][] docs, particularly the [`PerformanceOverlay`][] class, - and the [dart:developer][] package + and the [`dart:developer`][] package [`PerformanceOverlay`]: {{site.api}}/flutter/widgets/PerformanceOverlay-class.html [`RepaintBoundary`]: {{site.api}}/flutter/widgets/RepaintBoundary-class.html [`saveLayer`]: {{site.api}}/flutter/dart-ui/Canvas/saveLayer.html -[dart:developer]: {{site.api}}/flutter/dart-developer/dart-developer-library.html +[`dart:developer`]: {{site.api}}/flutter/dart-developer/dart-developer-library.html [Debugging]: /testing/debugging [devtools]: /tools/devtools [Flutter API]: {{site.api}} diff --git a/sites/docs/src/content/platform-integration/android/c-interop.md b/sites/docs/src/content/platform-integration/android/c-interop.md index ff52225d09..37ac60b4d3 100644 --- a/sites/docs/src/content/platform-integration/android/c-interop.md +++ b/sites/docs/src/content/platform-integration/android/c-interop.md @@ -117,7 +117,7 @@ On Android, the `native_add/android/build.gradle` links the code. The native code is invoked from dart in `lib/native_add_bindings_generated.dart`. -The bindings are generated with [package:ffigen]({{site.pub-pkg}}/ffigen). +The bindings are generated with [`package:ffigen`]({{site.pub-pkg}}/ffigen). ## Other use cases diff --git a/sites/docs/src/content/platform-integration/android/compose-activity.md b/sites/docs/src/content/platform-integration/android/compose-activity.md index 30e84b6674..1b51f5c4c2 100644 --- a/sites/docs/src/content/platform-integration/android/compose-activity.md +++ b/sites/docs/src/content/platform-integration/android/compose-activity.md @@ -191,37 +191,22 @@ The first file requiring modifications is `android/app/build.gradle`. ```groovy title="android/app/build.gradle" dependencies { - implementation("androidx.core:core-ktx:1.10.1") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose") - implementation(platform("androidx.compose:compose-bom:2024.06.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material:material") - implementation("androidx.compose.material3:material3") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") -implementation "androidx.core:core-ktx:1.10.1" -implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" -implementation "androidx.activity:activity-compose" -implementation platform("androidx.compose:compose-bom:2024.06.00") -implementation "androidx.compose.ui:ui" -implementation "androidx.compose.ui:ui-graphics" -implementation "androidx.compose.ui:ui-tooling-preview" -implementation "androidx.compose.material:material" -implementation "androidx.compose.material3:material3" -testImplementation "junit:junit:4.13.2" -androidTestImplementation "androidx.test.ext:junit:1.1.5" -androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" -androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") -androidTestImplementation "androidx.compose.ui:ui-test-junit4" -debugImplementation "androidx.compose.ui:ui-tooling" -debugImplementation "androidx.compose.ui:ui-test-manifest" + implementation "androidx.core:core-ktx:1.10.1" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" + implementation "androidx.activity:activity-compose" + implementation platform("androidx.compose:compose-bom:2024.06.00") + implementation "androidx.compose.ui:ui" + implementation "androidx.compose.ui:ui-graphics" + implementation "androidx.compose.ui:ui-tooling-preview" + implementation "androidx.compose.material:material" + implementation "androidx.compose.material3:material3" + testImplementation "junit:junit:4.13.2" + androidTestImplementation "androidx.test.ext:junit:1.1.5" + androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" + androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") + androidTestImplementation "androidx.compose.ui:ui-test-junit4" + debugImplementation "androidx.compose.ui:ui-tooling" + debugImplementation "androidx.compose.ui:ui-test-manifest" } ``` diff --git a/sites/docs/src/content/platform-integration/ios/c-interop.md b/sites/docs/src/content/platform-integration/ios/c-interop.md index 7a8acca11f..9dd33c015a 100644 --- a/sites/docs/src/content/platform-integration/ios/c-interop.md +++ b/sites/docs/src/content/platform-integration/ios/c-interop.md @@ -27,7 +27,7 @@ _native interface_ and _language bindings._ This page describes using the `dart:ffi` library in iOS apps. For information on Android, see [Binding to native Android code using dart:ffi][android-ffi]. -For information in macOS, see +For information on macOS, see [Binding to native macOS code using dart:ffi][macos-ffi]. This feature is not yet supported for web plugins. ::: @@ -108,7 +108,7 @@ On iOS, the `native_add/ios/native_add.podspec` links the code. The native code is invoked from dart in `lib/native_add_bindings_generated.dart`. -The bindings are generated with [package:ffigen]({{site.pub-pkg}}/ffigen). +The bindings are generated with [`package:ffigen`]({{site.pub-pkg}}/ffigen). ## Other use cases diff --git a/sites/docs/src/content/platform-integration/macos/c-interop.md b/sites/docs/src/content/platform-integration/macos/c-interop.md index a0e8d65d68..d5aaec844e 100644 --- a/sites/docs/src/content/platform-integration/macos/c-interop.md +++ b/sites/docs/src/content/platform-integration/macos/c-interop.md @@ -112,7 +112,7 @@ On iOS, the `native_add/macos/native_add.podspec` links the code. The native code is invoked from dart in `lib/native_add_bindings_generated.dart`. -The bindings are generated with [package:ffigen]({{site.pub-pkg}}/ffigen). +The bindings are generated with [`package:ffigen`]({{site.pub-pkg}}/ffigen). ## Other use cases diff --git a/sites/docs/src/content/platform-integration/web/web-images.md b/sites/docs/src/content/platform-integration/web/web-images.md index 62c268d7fa..a9a584c1d0 100644 --- a/sites/docs/src/content/platform-integration/web/web-images.md +++ b/sites/docs/src/content/platform-integration/web/web-images.md @@ -132,7 +132,9 @@ Examples: [CloudFlare Workers]: https://developers.cloudflare.com/workers/examples/cors-header-proxy [Firebase Functions]: {{site.github}}/7kfpun/cors-proxy -### Use a HTML platform view + + +### Use an HTML platform view If none of the other solutions work for your app, Flutter supports embedding raw HTML inside the app using diff --git a/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md b/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md index 3521ad3798..4b57d4eed1 100644 --- a/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md +++ b/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md @@ -415,7 +415,7 @@ To learn more about this `TestWindow` update, check out Code before migration: ```dart -testWidgets('My test', (WidgetTester tester) aysnc { +testWidgets('My test', (WidgetTester tester) async { // For all instances, replace window with platformDispatcher tester.binding.window.textScaleFactorTestValue = 42; addTearDown(tester.binding.window.clearTextScaleFactorTestValue); @@ -426,7 +426,7 @@ testWidgets('My test', (WidgetTester tester) aysnc { Code after migration: ```dart -testWidgets('My test', (WidgetTester tester) aysnc { +testWidgets('My test', (WidgetTester tester) async { // For all instances, replace window with platformDispatcher tester.binding.platformDispatcher.textScaleFactorTestValue = 42; addTearDown(tester.binding.platformDispatcher.clearTextScaleFactorTestValue); diff --git a/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md b/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md index c6dbc8bc4b..33dd39aff2 100644 --- a/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md +++ b/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md @@ -220,7 +220,7 @@ Removed in: Supported by Flutter Fix: yes -In v2.4, several changes were made ot the app bar classes and their themes to +In v2.4, several changes were made to the app bar classes and their themes to better align with Material Design. Several properties were deprecated at that time and have been removed. diff --git a/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md b/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md index f2a4203864..8e093ede55 100644 --- a/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md +++ b/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md @@ -90,7 +90,7 @@ Do the following from the top of your Flutter project. ## You didn't update Android Studio and still have a Java error The error appears similar to `Unsupported class file major version 65`. This is an indication that your Java version is newer than the version of -gradle you are running can handle. There is a non obvious set of dependencies +Gradle you are running can handle. There is a non-obvious set of dependencies surrounding AGP, Java, and Gradle. ### Solution 1: Android Studio diff --git a/sites/docs/src/content/release/breaking-changes/buttons.md b/sites/docs/src/content/release/breaking-changes/buttons.md index f454d9064a..fcc537bafa 100644 --- a/sites/docs/src/content/release/breaking-changes/buttons.md +++ b/sites/docs/src/content/release/breaking-changes/buttons.md @@ -197,7 +197,7 @@ of the defaults are. When a button or button theme specifies computed defaults. The button's `style` parameter overrides non-null properties specified by the corresponding button theme. For example if `foregroundColor` property of a `TextButton`'s style is non-null, it -overrides the same property for the `TextButonTheme`'s style. +overrides the same property for the `TextButtonTheme`'s style. As explained earlier, each button class includes a static method called `styleFrom` which constructs a ButtonStyle from a simple set of diff --git a/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md b/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md index 3807d52b94..d5bd73def7 100644 --- a/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md +++ b/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md @@ -41,7 +41,7 @@ the reason stated above. `EditableTextState` now creates a dedicated `Focus` widget to host `EditableText.focusNode`. This allows `EditableTextState`s to define handlers for shortcut `Intent`s. -For instance, `EditableText` now has a handler that +For instance, `EditableText` now has a handler that handles the "deleteCharacter" intent when the DEL key is pressed. diff --git a/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md b/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md index b00991195e..c430dc3388 100644 --- a/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md +++ b/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md @@ -56,7 +56,7 @@ custom tools or CI configurations might. For example, the Flutter team's own `api.flutter.dev` generation script: -```dart title="post_processe_docs.dart" +```dart title="post_process_docs.dart" final File versionFile = File('version'); final String version = versionFile.readAsStringSync(); ``` diff --git a/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md b/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md index 541c52bf0b..2b533e24aa 100644 --- a/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md +++ b/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md @@ -73,7 +73,7 @@ class MyImageProvider extends ImageProvider { class MyDelegatingProvider extends ImageProvider { MyDelegatingProvider(this.provider); - final ImageProvder provider; + final ImageProvider provider; @override ImageStreamCompleter load(MyDelegatingProvider key, DecoderCallback decode) { @@ -103,7 +103,7 @@ class MyImageProvider extends ImageProvider { class MyDelegatingProvider extends ImageProvider { MyDelegatingProvider(this.provider); - final ImageProvder provider; + final ImageProvider provider; @override ImageStreamCompleter loadBuffer(MyDelegatingProvider key, DecoderCallback decode) { diff --git a/sites/docs/src/content/release/breaking-changes/index.md b/sites/docs/src/content/release/breaking-changes/index.md index d7383e142c..b458358be8 100644 --- a/sites/docs/src/content/release/breaking-changes/index.md +++ b/sites/docs/src/content/release/breaking-changes/index.md @@ -380,7 +380,7 @@ The following breaking change was reverted in release 2.2: **[Network Policy on iOS and Android][]**
: Introduced in version: 2.0.0
- Reverted in version: 2.2.0 + Reverted in version: 2.2.0 [Network Policy on iOS and Android]: /release/breaking-changes/network-policy-ios-android diff --git a/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md b/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md index 8977731a0e..a68bdb8a44 100644 --- a/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md +++ b/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md @@ -154,9 +154,9 @@ Relevant PRs: * [PR 60141][]: Tweaking Material Chip a11y semantics to match buttons * [PR 60645][]: Revert "Tweaking Material Chip a11y - semantics to match buttons (#60141) + semantics to match buttons" (#60141) * [PR 61048][]: Re-land "Tweaking Material Chip a11y - semantics to match buttons (#60141) + semantics to match buttons" (#60141) [`ActionChip`]: {{site.api}}/flutter/material/ActionChip-class.html [`Chip`]: {{site.api}}/flutter/material/Chip-class.html diff --git a/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md b/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md index da9d973f54..0e70793945 100644 --- a/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md +++ b/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md @@ -77,12 +77,12 @@ void main() { SemanticsNode getChild(SemanticsNode node) { SemanticsNode child; - bool visiter(SemanticsNode target) { + bool visitor(SemanticsNode target) { child = target; return false; } - node.visitChildren(visiter); + node.visitChildren(visitor); return child; } ``` @@ -127,12 +127,12 @@ void main() { SemanticsNode getChild(SemanticsNode node) { SemanticsNode child; - bool visiter(SemanticsNode target) { + bool visitor(SemanticsNode target) { child = target; return false; } - node.visitChildren(visiter); + node.visitChildren(visitor); return child; } ``` diff --git a/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md b/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md index 82b5c019b6..c74d8950ed 100644 --- a/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md +++ b/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md @@ -11,7 +11,7 @@ description: > `ScrollBehavior`s now allow or disallow scrolling speeds to be affected by the number of pointers on the screen. `ScrollBehavior.multitouchDragStrategy`, by -default, prevents multiple pointers interacting wih the scrollable at the same +default, prevents multiple pointers interacting with the scrollable at the same time from affecting the speed of scrolling. ## Context diff --git a/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md b/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md index f55ed2459e..f44f2ec740 100644 --- a/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md +++ b/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md @@ -71,7 +71,7 @@ Then, add the network configuration to your $project_path/android/app/src/debug/ ``` It is also possible to set the policy per domain. See the Android -docuentation for more information. +documentation for more information. For iOS, you can follow [these instructions](/add-to-app/ios/project-setup/?tab=embed-using-cocoapods#set-local-network-privacy-permissions) to create a `Info-debug.plist` and put this in: diff --git a/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md b/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md index d3fe295e77..7780d792ff 100644 --- a/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md +++ b/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md @@ -97,7 +97,7 @@ In stable release: 2.0.0 API documentation: * [`RenderBox`][] -* [`computeMinInstrinsicWidth`][] +* [`computeMinIntrinsicWidth`][] * [`computeDryLayout`][] * [`getDryLayout`][] * [`performResize`][] @@ -114,7 +114,7 @@ Relevant PRs: [`RenderBox`]: {{site.api}}/flutter/rendering/RenderBox-class.html [`RenderBox.computeMinIntrinsicWidth`]: {{site.api}}/flutter/rendering/RenderBox/computeMinIntrinsicWidth.html -[`computeMinInstrinsicWidth`]: {{site.api}}/flutter/rendering/RenderBox/computeMinIntrinsicWidth.html +[`computeMinIntrinsicWidth`]: {{site.api}}/flutter/rendering/RenderBox/computeMinIntrinsicWidth.html [`computeDryLayout`]: {{site.api}}/flutter/rendering/RenderBox/computeDryLayout.html [`getDryLayout`]: {{site.api}}/flutter/rendering/RenderBox/getDryLayout.html [`performResize`]: {{site.api}}/flutter/rendering/RenderBox/performResize.html diff --git a/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md b/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md index 7e5fe310c5..8c2a66aa70 100644 --- a/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md +++ b/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md @@ -76,12 +76,12 @@ final List defaultItems = SystemContextMenu.getDefaultItems(editableTextState); final WidgetsLocalizations localizations = WidgetsLocalizations.of(context); -final List defaultItemDatas = +final List defaultItemData = defaultItems .map((IOSSystemContextMenuItem item) => item.getData(localizations)) .toList(); -_controller.showWithItems(selectionRect, defaultItemDatas); +_controller.showWithItems(selectionRect, defaultItemData); ``` ## Timeline diff --git a/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md b/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md index 4b1815c518..fe9983a5e7 100644 --- a/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md +++ b/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md @@ -305,8 +305,8 @@ For Objective-C projects, create a `SceneDelegate.h` and `SceneDelegate.m`: ## Migration guide for adding Flutter to existing app (Add to App) -Similar to the `FlutterAppDelegate`, the `FlutterSceneDelgate` is recommended -but not required. The `FlutterSceneDelgate` forwards scene callbacks, such as +Similar to the `FlutterAppDelegate`, the `FlutterSceneDelegate` is recommended +but not required. The `FlutterSceneDelegate` forwards scene callbacks, such as [`openURL`][] to plugins such as [local_auth][]. ### Create/Update a SceneDelegate diff --git a/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md b/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md index ec6fb155b7..ea8268029f 100644 --- a/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md +++ b/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md @@ -32,7 +32,7 @@ configure [`goldenFileComparator`][] and use it (when using a non-HTML web backend). For users that implement a custom [`WebGoldenComparator`][], you will -migrate the implemenation to [`GoldenFileComparator`][]. Fortunately the +migrate the implementation to [`GoldenFileComparator`][]. Fortunately the Canvas Kit and SkWasm backends already required similar methods (`compareButes` and `updateBytes`). diff --git a/sites/docs/src/content/release/whats-new.md b/sites/docs/src/content/release/whats-new.md index a7eea21e49..baa902d9cb 100644 --- a/sites/docs/src/content/release/whats-new.md +++ b/sites/docs/src/content/release/whats-new.md @@ -36,7 +36,7 @@ In addition to many smaller updates, here are some of the more significant changes: * We have introduced a new getting started experience for - both Flutter and Dart, as announced in a recent [blog post][fwe]. + both Flutter and Dart, as announced in a recent [blog post][few]. You can find the Flutter [learning pathway][] under the **Learn** tab at the top of [docs.flutter.dev][]. To return to the rest of the site, select the **Guides** tab. As always, the **Reference** @@ -55,7 +55,7 @@ significant changes: [bc-3-41]: /release/breaking-changes#released-in-flutter-3-41 [docs.flutter.dev]: / [Flutter API docs]: {{site.api}} -[fwe]: {{site.flutter-blog}}/announcing-our-new-dart-and-flutter-getting-started-experience-b8c4b2be0984 +[few]: {{site.flutter-blog}}/announcing-our-new-dart-and-flutter-getting-started-experience-b8c4b2be0984 [learning pathway]: /learn [navaronbracke]: {{site.github}}/navaronbracke [official glossary]: /resources/glossary diff --git a/sites/docs/src/content/resources/ads-overview.md b/sites/docs/src/content/resources/ads-overview.md index 69a210350a..6f8ce56025 100644 --- a/sites/docs/src/content/resources/ads-overview.md +++ b/sites/docs/src/content/resources/ads-overview.md @@ -10,14 +10,14 @@ showBreadcrumbs: false The Google Mobile Ads SDK for Flutter works with both AdMob and Ad Manager. It supports a variety -of ads formats such as app open, banner, interstitial, +of ad formats such as app open, banner, interstitial, native, rewarded, and rewarded interstitial formats, and features like mediation. Easily integrate Google AdMob and Ad Manager ads directly in your Flutter App -The the following resources can help get you started: +The following resources can help get you started: * [Add ads to your mobile Flutter app or game][] (cookbook recipe) * [Adding AdMob ads to a Flutter app][] (codelab) diff --git a/sites/docs/src/content/resources/in-app-purchases-overview.md b/sites/docs/src/content/resources/in-app-purchases-overview.md index 10aa2875ba..c50a70d2e4 100644 --- a/sites/docs/src/content/resources/in-app-purchases-overview.md +++ b/sites/docs/src/content/resources/in-app-purchases-overview.md @@ -11,7 +11,7 @@ showBreadcrumbs: false Build in-app revenue with Google Play and App Store support for Flutter -The the following resources can help get you started: +The following resources can help get you started: * [Add in-app purchases to your Flutter app][] (codelab) diff --git a/sites/docs/src/content/testing/common-errors.md b/sites/docs/src/content/testing/common-errors.md index 72182045f1..cf0bbc3f4f 100644 --- a/sites/docs/src/content/testing/common-errors.md +++ b/sites/docs/src/content/testing/common-errors.md @@ -108,7 +108,7 @@ the `Column` tries to be wider than the space the `Row` (its parent) can allocate to it, causing an overflow error. Why does the `Column` try to do that? To understand this layout behavior, you need to know -how Flutter framework performs layout: +how the Flutter framework performs layout: "_To perform layout, Flutter walks the render tree in a depth-first traversal and **passes down size constraints** from parent to child… Children respond by diff --git a/sites/docs/src/content/tools/antigravity.md b/sites/docs/src/content/tools/antigravity.md index 5f5be92390..8750a193f0 100644 --- a/sites/docs/src/content/tools/antigravity.md +++ b/sites/docs/src/content/tools/antigravity.md @@ -34,7 +34,7 @@ the [Antigravity site](https://antigravity.google/download). more or less control. Even if you select **Agent driven development**, which allows Antigravity to directly run commands without approval, you can specify certain commands that will _always_ ask - for your approval, such as the `rm` command to removes files. + for your approval, such as the `rm` command to remove files. 1.

Install the Dart and Flutter extensions

diff --git a/sites/docs/src/content/tools/devtools/cpu-profiler.md b/sites/docs/src/content/tools/devtools/cpu-profiler.md index dc2c1dfa31..9a0e3a62e5 100644 --- a/sites/docs/src/content/tools/devtools/cpu-profiler.md +++ b/sites/docs/src/content/tools/devtools/cpu-profiler.md @@ -52,10 +52,10 @@ pass the `--profile-startup` flag to `dart run` or `flutter run`. This table provides a bottom-up representation of a CPU profile. This means that each top-level method, -or root, in the bottom up table is actually the +or root, in the bottom-up table is actually the top method in the call stack for one or more CPU samples. -In other words, each top-level method in a bottom up -table is a leaf node from the top down table +In other words, each top-level method in a bottom-up +table is a leaf node from the top-down table (the call tree). In this table, a method can be expanded to show its _callers_. @@ -64,7 +64,7 @@ in a CPU profile. When a root node in this table has a high _self_ time, that means that many CPU samples in this profile ended with that method on top of the call stack. -![Screenshot of the Bottom up view](/assets/images/docs/tools/devtools/bottom-up-view.png) +![Screenshot of the Bottom-up view](/assets/images/docs/tools/devtools/bottom-up-view.png) See the [Guidelines](#guidelines) section below to learn how to enable the blue and green vertical lines seen in this image. @@ -87,7 +87,7 @@ this is the self time of the top-level method (the callee) when called through the child method (the caller). **Table element** (self time) -![Screenshot of a bottom up table](/assets/images/docs/tools/devtools/table-element.png) +![Screenshot of a bottom-up table](/assets/images/docs/tools/devtools/table-element.png) ### Call tree diff --git a/sites/docs/src/content/tools/devtools/inspector.md b/sites/docs/src/content/tools/devtools/inspector.md index db47d6ee34..e9b4142264 100644 --- a/sites/docs/src/content/tools/devtools/inspector.md +++ b/sites/docs/src/content/tools/devtools/inspector.md @@ -585,7 +585,7 @@ Let us know if there are issues preventing you from using the new inspector by [ By default, DevTools limits the widgets displayed in the widget tree to those created in the project's root directory. To see all widgets, including those created outside -of a the project's root directory, toggle on [Show implementation widgets][] +of a project's root directory, toggle on [Show implementation widgets][] In order to include other widgets in the default widget tree, a parent directory of theirs must be added to the Package Directories. diff --git a/sites/docs/src/content/tools/devtools/legacy-inspector.md b/sites/docs/src/content/tools/devtools/legacy-inspector.md index 0c44c87690..cc359a3b71 100644 --- a/sites/docs/src/content/tools/devtools/legacy-inspector.md +++ b/sites/docs/src/content/tools/devtools/legacy-inspector.md @@ -112,7 +112,7 @@ constraints. Additionally, the explorer shows layout constraint violations and render overflow errors. Violated layout constraints are colored red, and overflow errors are presented in the -standard "yellow-tape" pattern, as you might see on a running +standard "yellow-tape" pattern, as you might see on a running device. These visualizations aim to improve understanding of why overflow errors occur as well as how to fix them. diff --git a/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md b/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md index b370b2f7cc..0712b262a8 100644 --- a/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md +++ b/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md @@ -19,7 +19,7 @@ To learn about the improvements included in DevTools 2.28.4, please read the * Only cache pub root directories added by the user. - [#6897](https://github.com/flutter/devtools/pull/6897) -* Remove Flutter pub root if it was accidently cached. - [#6911](https://github.com/flutter/devtools/pull/6911) +* Remove Flutter pub root if it was accidentally cached. - [#6911](https://github.com/flutter/devtools/pull/6911) ## DevTools Extension updates diff --git a/sites/docs/src/content/tools/hot-reload.md b/sites/docs/src/content/tools/hot-reload.md index 6c36bafe18..4aa1c70075 100644 --- a/sites/docs/src/content/tools/hot-reload.md +++ b/sites/docs/src/content/tools/hot-reload.md @@ -84,7 +84,7 @@ and full restart?** * **Hot reload** loads code changes into the VM or the browser, and re-builds the widget tree, preserving the app state; it doesn't rerun `main()` or `initState()`. - (`⌘\` in Intellij and Android Studio, `⌃F5` in VSCode) + (`⌘\` in IntelliJ and Android Studio, `⌃F5` in VSCode) * **Hot restart** loads code changes into the VM or the browser, and restarts the Flutter app, losing the app state. On the web, this can restart the app without a full page refresh. diff --git a/sites/docs/src/content/tools/pubspec.md b/sites/docs/src/content/tools/pubspec.md index 670457d97e..958827fccc 100644 --- a/sites/docs/src/content/tools/pubspec.md +++ b/sites/docs/src/content/tools/pubspec.md @@ -161,7 +161,7 @@ flutter: ``` ```yaml -# flavor_path_field strucure +# flavor_path_field structure - path: path/to/directory flavors: - flavor_name diff --git a/sites/docs/src/content/ui/adaptive-responsive/more-info.md b/sites/docs/src/content/ui/adaptive-responsive/more-info.md index 71d4c4f117..91f15b8c78 100644 --- a/sites/docs/src/content/ui/adaptive-responsive/more-info.md +++ b/sites/docs/src/content/ui/adaptive-responsive/more-info.md @@ -9,7 +9,7 @@ shortTitle: Learn ## Examples If you'd like to see how the adaptive and responsive -concepts (as described in these pages) come together. +concepts (as described in these pages) come together, check out the source code for the following apps: * [Wonderous][] diff --git a/sites/docs/src/content/ui/assets/asset-transformation.md b/sites/docs/src/content/ui/assets/asset-transformation.md index ed443d1e3f..d38da5d249 100644 --- a/sites/docs/src/content/ui/assets/asset-transformation.md +++ b/sites/docs/src/content/ui/assets/asset-transformation.md @@ -73,7 +73,7 @@ the file to transform and `--output`, which is the location where the transformer code must write its output to. If the transformer finishes with a non-zero exit code, the application build -fails with error message explaining that transformation of the asset failed. +fails with an error message explaining that transformation of the asset failed. Anything written to the [`stderr`] stream of the process by the transformer is included in the error message. diff --git a/sites/docs/src/content/ui/interactivity/focus.md b/sites/docs/src/content/ui/interactivity/focus.md index 83c5401984..855feedff4 100644 --- a/sites/docs/src/content/ui/interactivity/focus.md +++ b/sites/docs/src/content/ui/interactivity/focus.md @@ -531,7 +531,7 @@ to switch between a "touch" mode and a "traditional" (mouse and keyboard) mode for their focus highlights. When a user is using touch to navigate, the focus highlight is usually hidden, and when they switch to a mouse or keyboard, the focus highlight needs to be shown again so they know what is focused. The -`hightlightStrategy` tells the focus manager how to interpret changes in the +`highlightStrategy` tells the focus manager how to interpret changes in the usage mode of the device: it can either automatically switch between the two based on the most recent input events, or it can be locked in touch or traditional modes. The provided widgets in Flutter already know how to use this diff --git a/sites/docs/src/content/ui/internationalization/index.md b/sites/docs/src/content/ui/internationalization/index.md index 61209cc847..b812a7841f 100644 --- a/sites/docs/src/content/ui/internationalization/index.md +++ b/sites/docs/src/content/ui/internationalization/index.md @@ -1136,7 +1136,7 @@ check out the [flutter_localizations README][]. Once you've implemented your language-specific subclasses of `GlobalMaterialLocalizations` and `LocalizationsDelegate`, -you need to add the language and a delegate instance to your app. +you need to add the language and a delegate instance to your app. The following code sets the app's language to Nynorsk and adds the `NnMaterialLocalizations` delegate instance to the app's `localizationsDelegates` list: @@ -1261,7 +1261,7 @@ Rebuilding `l10n/messages_all.dart` requires two steps. 2. With the app's root directory as the current directory, generate `intl_messages_.dart` for each `intl_.arb` file and `intl_messages_all.dart`, - which imports all of the messages files: + which imports all the message files: ```console $ dart run intl_translation:generate_from_arb \ From a4bb1dd4d102f16b29f5a3ee72f22aaf99428e15 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 12 May 2026 01:54:18 +0200 Subject: [PATCH 05/28] Update breaking changes for upcoming 3.44 release (#13377) Once I have a chance I'll open a follow-up PR with some clean up to each notice and guide. --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../decouple-page-transition-builders.md | 4 +-- .../deprecate-onreorder-callback.md | 2 +- ...precate-text-input-connection-set-style.md | 4 +-- .../icondata-class-marked-final.md | 9 +++-- .../content/release/breaking-changes/index.md | 11 ++++-- .../list-tile-color-warning.md | 4 +-- .../migrate-to-built-in-kotlin/index.md | 35 ++++++++++++------- .../raw-menu-anchor-close-order.md | 2 +- .../breaking-changes/scroll-cache-extent.md | 2 +- 9 files changed, 46 insertions(+), 27 deletions(-) diff --git a/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md b/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md index 32999695e7..202fc1a7a2 100644 --- a/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md +++ b/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md @@ -75,8 +75,8 @@ If your app already imports both packages, no changes are needed. ## Timeline -Landed in version: Not yet released
-In stable release: Not yet released +Landed in version: 3.43.0-0.1.pre
+In stable release: 3.44 ## References diff --git a/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md b/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md index db35c646a4..ab93e7980d 100644 --- a/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md +++ b/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md @@ -143,7 +143,7 @@ due to the change in meaning for the second callback parameter. ## Timeline Landed in version: 3.41.0-1.0.pre-364
-In stable release: Not yet +In stable release: 3.44 ## References diff --git a/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md b/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md index c462be190c..b782d9be01 100644 --- a/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md +++ b/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md @@ -58,8 +58,8 @@ connection.updateStyle( ## Timeline -Landed in version: TBD
-In stable release: Not yet +Landed in version: 3.43.0-0.1.pre
+In stable release: 3.44 ## References diff --git a/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md b/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md index 0c68a8111f..088c976f06 100644 --- a/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md +++ b/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md @@ -119,15 +119,20 @@ Icon(myDynamicIconData); ## Timeline -Change landed in version: Not yet
-In stable release: Not yet +Landed in version: 3.44.0-0.1.pre
+In stable release: 3.44 ## References +Relevant PR: + +* [PR 181345][] + Relevant issues: * [Issue 181342][] * [Issue 181344][] +[PR 181345]: {{site.repo.flutter}}/pull/181345 [Issue 181342]: {{site.repo.flutter}}/issues/181342 [Issue 181344]: {{site.repo.flutter}}/issues/181344 diff --git a/sites/docs/src/content/release/breaking-changes/index.md b/sites/docs/src/content/release/breaking-changes/index.md index b458358be8..b6d97d9a9d 100644 --- a/sites/docs/src/content/release/breaking-changes/index.md +++ b/sites/docs/src/content/release/breaking-changes/index.md @@ -36,17 +36,22 @@ They're sorted by release and listed in alphabetical order: ### Not yet released to stable +* [Large screen orientation and resizability restrictions ignored on Android 17][] + +[Large screen orientation and resizability restrictions ignored on Android 17]: /release/breaking-changes/android-large-screens-restrictions-ignored + + +### Released in Flutter 3.44 + * [Changing RawMenuAnchor close order][] * [Deprecate `onReorder` callback][] -* [Deprecated `cacheExtent` and `cacheExtentStyle`][] * [Deprecate `TextInputConnection.setStyle`][] +* [Deprecated `cacheExtent` and `cacheExtentStyle`][] * [`IconData` class marked as `final`][] -* [Large screen orientation and resizability restrictions ignored on Android 17][] * [ListTile reports error in debug when wrapped in a colored widget][] * [Migrating Flutter Android projects to built-in Kotlin][] * [Page transition builders reorganization][] -[Large screen orientation and resizability restrictions ignored on Android 17]: /release/breaking-changes/android-large-screens-restrictions-ignored [Changing RawMenuAnchor close order]: /release/breaking-changes/raw-menu-anchor-close-order [Deprecate `onReorder` callback]: /release/breaking-changes/deprecate-onreorder-callback [Deprecated `cacheExtent` and `cacheExtentStyle`]: /release/breaking-changes/scroll-cache-extent diff --git a/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md b/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md index fb16431886..15b6580747 100644 --- a/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md +++ b/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md @@ -89,8 +89,8 @@ Container( ## Timeline -Landed in version: TBD -In stable release: Not yet +Landed in version: 3.43.0-0.1.pre
+In stable release: 3.44 ## References diff --git a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md index 3a4c165861..d96ca76499 100644 --- a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md +++ b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md @@ -35,11 +35,18 @@ In a future Flutter version, support for applying KGP will be removed To learn more about Android Gradle Plugin, see the [Android Gradle Plugin docs][AGP block]. +[AGP block]: {{site.android-dev}}/build/releases/gradle-plugin + ## Migrate -**For app developers:** See the [app developer migration guide][app-migration-guide]. +**For app developers:** +Follow the [app developer migration guide][app-migration-guide]. + +**For plugin authors:** +Follow the [plugin author migration guide][plugin-migration-guide]. -**For plugin authors:** See the [plugin author migration guide][plugin-migration-guide]. +[app-migration-guide]: /release/breaking-changes/migrate-to-built-in-kotlin/for-app-developers +[plugin-migration-guide]: /release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors ## Next steps @@ -52,6 +59,13 @@ see the [Android Gradle Plugin docs][AGP block]. completes the migration to the new AGP DSL, the Flutter team will remove support for the old DSL [Issue #184839][]. +## Timeline + +Landed in version: 3.44.0-0.1.pre
+In stable release: 3.44 + +## References + Relevant issues: - [Issue #180137][]: Migrate from old to new AGP DSL @@ -67,14 +81,9 @@ Consider staying up to date with the latest version of the build files by periodically running `flutter upgrade` in your app's directory. -[AGP block]: {{site.android-dev}}/build/releases/gradle-plugin - -[Issue #180137]: {{site.github}}/flutter/flutter/issues/180137 -[Issue #181383]: {{site.github}}/flutter/flutter/issues/181383 -[Issue #183909]: {{site.github}}/flutter/flutter/issues/183909 -[Issue #184837]: {{site.github}}/flutter/flutter/issues/184837 -[Issue #184838]: {{site.github}}/flutter/flutter/issues/184838 -[Issue #184839]: {{site.github}}/flutter/flutter/issues/184839 - -[app-migration-guide]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-app-developers -[plugin-migration-guide]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors +[Issue #180137]: {{site.repo.flutter}}/issues/180137 +[Issue #181383]: {{site.repo.flutter}}/issues/181383 +[Issue #183909]: {{site.repo.flutter}}/issues/183909 +[Issue #184837]: {{site.repo.flutter}}/issues/184837 +[Issue #184838]: {{site.repo.flutter}}/issues/184838 +[Issue #184839]: {{site.repo.flutter}}/issues/184839 diff --git a/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md b/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md index 01e0d58868..b0e7ea4f5f 100644 --- a/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md +++ b/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md @@ -122,7 +122,7 @@ This migration is not supported by `dart fix` ## Timeline Landed in version: 3.44.0-0.1.pre
-In stable release: TBD +In stable release: 3.44 ## References diff --git a/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md b/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md index ed58b7d296..8b0c5c3d34 100644 --- a/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md +++ b/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md @@ -97,7 +97,7 @@ renderViewport.scrollCacheExtent = const ScrollCacheExtent.pixels(500.0); ## Timeline Landed in version: 3.41.0-0.0.pre
-In stable release: TBD +In stable release: 3.44 ## References From 6ee766f11d12e4062b106533780bb6e7f935ed0c Mon Sep 17 00:00:00 2001 From: Shams Zakhour <44418985+sfshaza2@users.noreply.github.com> Date: Tue, 12 May 2026 11:39:12 -0700 Subject: [PATCH 06/28] Adding instructions on using Swift Package Manager (#13359) Fixes https://github.com/flutter/website/issues/13283 --- .../developing-packages.md | 95 ++++++++++--------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/sites/docs/src/content/packages-and-plugins/developing-packages.md b/sites/docs/src/content/packages-and-plugins/developing-packages.md index 94a2c5f8c1..f81df7872a 100644 --- a/sites/docs/src/content/packages-and-plugins/developing-packages.md +++ b/sites/docs/src/content/packages-and-plugins/developing-packages.md @@ -297,7 +297,7 @@ dependencies: hello_windows: ^1.0.0 ``` -Note that as shown here, an app-facing package can have +Note that, as shown here, an app-facing package can have some platforms implemented within the package, and others in endorsed federated implementations. @@ -419,8 +419,11 @@ We recommend you edit the Android code using Android Studio. Before editing the Android platform code in Android Studio, first make sure that the code has been built at least once (in other words, run the example app from your IDE/editor, -or in a terminal execute -`cd hello/example; flutter build apk --config-only`). +or in a terminal execute: + +```console +cd hello/example; flutter build apk --config-only +``` Then use the following steps: @@ -463,51 +466,62 @@ the path will end with `hello/darwin/Classes` instead.) You can run the example app by pressing the run (▶) button. -##### Add CocoaPod dependencies +##### Add native Darwin dependencies (Swift Package Manager) -:::warning -Flutter is migrating to [Swift Package Manager][] -to manage iOS and macOS native dependencies. -Flutter's support of Swift Package Manager is under development. -The implementation might change in the future. -Swift Package Manager support is only available -on Flutter's [`main` channel][]. -Flutter continues to support CocoaPods. -::: +Flutter uses Swift Package Manager as the primary strategy to manage +native iOS and macOS dependencies. -[Swift Package Manager]: https://www.swift.org/documentation/package-manager/ -[`main` channel]: /install/upgrade#switching-flutter-channels +To add a dependency to your plugin using Swift Package Manager: -Use the following instructions to add `HelloPod` with the version `0.0.1`: +1. Create a `Package.swift` file in your plugin's `ios/my_plugin_name` + or `macos/my_plugin_name` directory. +2. Declare your native dependency within the `dependencies` array of the + `Package.swift` descriptor file: -1. Specify the dependency at the end of `ios/hello.podspec`: +```swift title="Package.swift" +dependencies: [ + .package(url: "https://github.com/path/to/HelloLibrary.git", from: "1.0.0") +] +``` - ```ruby - s.dependency 'HelloPod', '0.0.1' - ``` +For complete details and instructions on structuring native folders, resource +bundling, or handling hybrid setups, +visit the [Swift Package Manager for plugin authors][] guide. - For private pods, refer to - [Private CocoaPods][] to ensure repo access: +[Swift Package Manager for plugin authors]: /packages-and-plugins/swift-package-manager/for-plugin-authors - ```ruby - s.source = { - # For pods hosted on GitHub - :git => "https://github.com/path/to/HelloPod.git", - # Alternatively, for pods hosted locally - # :path => "file:///path/to/private/repo", - :tag => s.version.to_s - }` - ``` +##### Add CocoaPod dependencies (Legacy) -[Private CocoaPods]: https://guides.cocoapods.org/making/private-cocoapods.html +Flutter continues to support CocoaPods for backward compatibility. If your +plugin needs to support developers who haven't migrated to Swift Package +Manager yet, specify your CocoaPods dependency at the end of +`ios/hello.podspec`: + +```ruby +s.dependency 'HelloPod', '0.0.1' +``` -2. Installing the plugin +For private pods, refer to +[Private CocoaPods][] to ensure repo access: - - Add the plugin in the project’s `pubspec.yaml` dependencies. - - Run `flutter pub get`. - - In the project’s `ios/` directory, run `pod install`. +```ruby +s.source = { + # For pods hosted on GitHub + :git => "https://github.com/path/to/HelloPod.git", + # Alternatively, for pods hosted locally + # :path => "file:///path/to/private/repo", + :tag => s.version.to_s + } +``` -The pod should appear in the installation summary. +[Private CocoaPods]: https://guides.cocoapods.org/making/private-cocoapods.html + +##### Installing the plugin dependencies + +To fetch and link the plugin's dependencies, add the plugin to your app project's +`pubspec.yaml` dependencies, and run `flutter pub get`. Flutter automatically +resolves and wires up the Swift Package Manager descriptors or CocoaPods +pod files during the native app build step. If your plugin requires a privacy manifest, for example, if it uses any **required reason APIs**, @@ -1005,13 +1019,6 @@ For additional details on `.podspec` files, see the All web dependencies are handled by the `pubspec.yaml` file, like any other Dart package. -{% comment %} - -### MacOS - -PENDING -{% endcomment %} - [bind-native]: /platform-integration/bind-native-code [CocoaPods Documentation]: https://guides.cocoapods.org/syntax/podspec.html [Dart library package]: {{site.dart-site}}/guides/libraries/create-library-packages From e927ec21e7ed6c185ade4c0e7341c4bcaff20434 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Tue, 12 May 2026 15:15:17 -0500 Subject: [PATCH 07/28] Add contributor ladder doc redirect (#13381) Add `/go/contributor-ladder` redirect to contribute ladder doc. Related to https://github.com/flutter/flutter/issues/186415 --- firebase.json | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase.json b/firebase.json index 1c35e1849e..ab84876564 100644 --- a/firebase.json +++ b/firebase.json @@ -371,6 +371,7 @@ { "source": "/go/compass-25", "destination": "https://github.com/flutter/demos/tree/main/compass_25", "type": 301 }, { "source": "/go/configurable-autosubmit", "destination": "https://docs.google.com/document/d/14pf4jfBy1-PHYmJLVbeqrh1swTF01SZ2YD3DR_Qv3kM/edit?usp=sharing&resourcekey=0-AW7-kNNGmmpSUqyOvBdwRg", "type": 301 }, { "source": "/go/contextual-menus", "destination": "https://docs.google.com/document/d/1F1itGgbSS3Cbq70hScSCNriDoux1sMGF9LHZsMdvU74/edit?resourcekey=0-RkHGwhe-tcoTGlaQyclPtQ", "type": 301 }, + { "source": "/go/contributor-ladder", "destination": "https://docs.google.com/document/d/1ITkAaE96R1kWgttDFVQYYKvdyHlcOz_Rs1QyiS8JMEY/edit?usp=sharing", "type": 301 }, { "source": "/go/cross_file-content-uri-implementation", "destination": "https://docs.google.com/document/d/1-d7uWlB9ERPIOFRQ1nJGGiPDb9ALh7QxincEPOmGc3c", "type": 301 }, { "source": "/go/cupertino-bottom-sheet-routes", "destination": "https://docs.google.com/document/d/16eMliX4HsDjRmEob2lksM6JBq2_LPVM26uYGyTid1ec/edit#", "type": 301 }, { "source": "/go/cupertino-context-menu-action", "destination": "https://docs.google.com/document/d/1lCuPyAbIzAr0c2KIEZhREC_EnkTKBxNiqP6lGLT-KpU/edit", "type": 301 }, From dcf753a783e79f6dd3640ace970a37cf5fc6f2a1 Mon Sep 17 00:00:00 2001 From: Kevin Chisholm Date: Fri, 15 May 2026 13:35:28 -0500 Subject: [PATCH 08/28] Preliminary 3.44 release notes (#13385) Co-authored-by: Parker Lougheed --- .../content/release/release-notes/index.md | 5 + .../release-notes/release-notes-3.44.0.md | 1006 +++++++++++++++++ 2 files changed, 1011 insertions(+) create mode 100644 sites/docs/src/content/release/release-notes/release-notes-3.44.0.md diff --git a/sites/docs/src/content/release/release-notes/index.md b/sites/docs/src/content/release/release-notes/index.md index 6564de5ae1..cc26faa473 100644 --- a/sites/docs/src/content/release/release-notes/index.md +++ b/sites/docs/src/content/release/release-notes/index.md @@ -22,6 +22,9 @@ outlined in the [Beta channel][] section of the [SDK archive][] page. ## Stable releases +* 3.44.0 + * [3.44.0 release notes & change log][] + * [3.44.0 breaking changes & migrations][] * 3.41.0 * [3.41.0 announcement][] * [3.41.0 release notes & change log][] @@ -119,6 +122,8 @@ outlined in the [Beta channel][] section of the [SDK archive][] page. * Earlier * [Archived release notes][] +[3.44.0 release notes & change log]: /release/release-notes/release-notes-3.44.0 +[3.44.0 breaking changes & migrations]: /release/breaking-changes#released-in-flutter-3-44 [3.41.0 announcement]: {{site.flutter-blog}}/whats-new-in-flutter-3-41-302ec140e632 [3.41.0 release notes & change log]: /release/release-notes/release-notes-3.41.0 [3.41.0 breaking changes & migrations]: /release/breaking-changes#released-in-flutter-3-41 diff --git a/sites/docs/src/content/release/release-notes/release-notes-3.44.0.md b/sites/docs/src/content/release/release-notes/release-notes-3.44.0.md new file mode 100644 index 0000000000..a65ff18451 --- /dev/null +++ b/sites/docs/src/content/release/release-notes/release-notes-3.44.0.md @@ -0,0 +1,1006 @@ +--- +title: Flutter 3.44.0 release notes +shortTitle: 3.44.0 release notes +description: Release notes for Flutter 3.44.0. +skipTemplateRendering: true +--- + +This page has release notes for Flutter 3.44. + +## What's changed + +### Framework + +* Add new motion accessibility features to iOS. by @ksokolovskyi in [178102](https://github.com/flutter/flutter/pull/178102) +* Implementation of tooltip windows for win32 by @mattkae in [179147](https://github.com/flutter/flutter/pull/179147) +* Make sure that an EditableText doesn't crash in 0x0 environment by @ahmedsameha1 in [180457](https://github.com/flutter/flutter/pull/180457) +* Merge `widget_tester_leaks_free_test.dart` into `widget_tester_test.dart` by @dkwingsmt in [180600](https://github.com/flutter/flutter/pull/180600) +* Make sure that a Container doesn't crash in 0x0 environment by @ahmedsameha1 in [180350](https://github.com/flutter/flutter/pull/180350) +* Make sure that an Expansible doesn't crash in 0x0 environment by @ahmedsameha1 in [180478](https://github.com/flutter/flutter/pull/180478) +* Make sure that a CupertinoTabScaffold doesn't crash in 0x0 environment by @ahmedsameha1 in [179824](https://github.com/flutter/flutter/pull/179824) +* Make sure that a FlutterLogo doesn't crash in 0x0 environment by @ahmedsameha1 in [180617](https://github.com/flutter/flutter/pull/180617) +* Make sure that a LongPressDraggable doesn't crash in 0x0 environment by @ahmedsameha1 in [180408](https://github.com/flutter/flutter/pull/180408) +* Migrate doc and code to use sendAnnounce by @chunhtai in [180776](https://github.com/flutter/flutter/pull/180776) +* Add API sample and docs for Expansible widget by @gowsikraja in [180273](https://github.com/flutter/flutter/pull/180273) +* Fix RawAutocomplete unmounted crash during async optionsBuilder by @augustocesarperin in [180824](https://github.com/flutter/flutter/pull/180824) +* Manually roll test dependencies by @goderbauer in [180886](https://github.com/flutter/flutter/pull/180886) +* Make sure that a DisplayFeatureSubScreen doesn't crash in 0x0 environ… by @ahmedsameha1 in [180357](https://github.com/flutter/flutter/pull/180357) +* Make sure that a DragTarget doesn't crash in 0x0 environment by @ahmedsameha1 in [180422](https://github.com/flutter/flutter/pull/180422) +* Make sure that a FormField doesn't crash at 0x0 environment by @ahmedsameha1 in [180810](https://github.com/flutter/flutter/pull/180810) +* Make sure that a Banner doesn't crash in 0x0 environment by @ahmedsameha1 in [180254](https://github.com/flutter/flutter/pull/180254) +* Make sure that an ErrorWidget doesn't crash in 0x0 environment by @ahmedsameha1 in [180830](https://github.com/flutter/flutter/pull/180830) +* Make sure that a FocusScope doesn't crash in 0x0 environment by @ahmedsameha1 in [180715](https://github.com/flutter/flutter/pull/180715) +* Add Flutter as a Swift Package dependency by @vashworth in [178931](https://github.com/flutter/flutter/pull/178931) +* Update link to FlutterTest font generation script by @lsaudon in [179957](https://github.com/flutter/flutter/pull/179957) +* Add RouteSettings to showCupertinoSheet by @jonmountjoy in [178643](https://github.com/flutter/flutter/pull/178643) +* Implement superellipse support for CupertinoFocusHalo by @O-Hannonen in [180724](https://github.com/flutter/flutter/pull/180724) +* Manual roll of pub packages including an update to meta version 1.18.0 by @jason-simmons in [181078](https://github.com/flutter/flutter/pull/181078) +* fix(windows): use wcsnlen for defensive programming (CWE-126) by @dbebawy in [180419](https://github.com/flutter/flutter/pull/180419) +* Remove divider from widgets tests by @navaronbracke in [180999](https://github.com/flutter/flutter/pull/180999) +* Remove MaterialButtons and Divider from draggable_scrollable_sheet_test.dart by @navaronbracke in [180996](https://github.com/flutter/flutter/pull/180996) +* remove unused divider by @navaronbracke in [180990](https://github.com/flutter/flutter/pull/180990) +* use null-aware element in `pointer_signal_resolver.0.dart‎` by @AbdeMohlbi in [180981](https://github.com/flutter/flutter/pull/180981) +* Fix test cross-imports for ListTile by @huycozy in [180572](https://github.com/flutter/flutter/pull/180572) +* Enhance Hero widget with customizable animation curves by @aaazlkm in [180100](https://github.com/flutter/flutter/pull/180100) +* Improve the algorithm for rounded superellipse paths to work better at very large ratio by @dkwingsmt in [180453](https://github.com/flutter/flutter/pull/180453) +* Make sure that an AnimatedSwitcher doesn't crash in 0x0 environment by @ahmedsameha1 in [180190](https://github.com/flutter/flutter/pull/180190) +* Make sure that a Form doesn't crash in 0x0 environment by @ahmedsameha1 in [180792](https://github.com/flutter/flutter/pull/180792) +* Add RenderSliver.getMaxPaintRect by @zemanux in [180074](https://github.com/flutter/flutter/pull/180074) +* Make sure that a Focus doesn't crash in 0x0 environment by @ahmedsameha1 in [180674](https://github.com/flutter/flutter/pull/180674) +* Add RawTooltipl example and test by @AbdeMohlbi in [180722](https://github.com/flutter/flutter/pull/180722) +* [Android] Add display corner radii support. by @ksokolovskyi in [179219](https://github.com/flutter/flutter/pull/179219) +* Make sure that a GridPaper doesn't crash in 0x0 environment by @ahmedsameha1 in [180906](https://github.com/flutter/flutter/pull/180906) +* Make sure that an Icon doesn't crash in 0x0 environment by @ahmedsameha1 in [181021](https://github.com/flutter/flutter/pull/181021) +* fix description for semantics finders by @navaronbracke in [181214](https://github.com/flutter/flutter/pull/181214) +* Use null-aware elements in cupertino/nav_bar.dart by @brahim-guaali in [181237](https://github.com/flutter/flutter/pull/181237) +* Fix remove material import textfield by @kazbeksultanov in [181254](https://github.com/flutter/flutter/pull/181254) +* Make sure that a Hero doesn't crash in 0x0 environment by @ahmedsameha1 in [180954](https://github.com/flutter/flutter/pull/180954) +* Add ExpansibleController.toggle method. by @ksokolovskyi in [181320](https://github.com/flutter/flutter/pull/181320) +* Fix leaks in `flutter_test` tests by @dkwingsmt in [180879](https://github.com/flutter/flutter/pull/180879) +* Make topGap not required for CupertinoSheetTransition by @MitchellGoodwin in [181269](https://github.com/flutter/flutter/pull/181269) +* Remove unnecessary Material import from sliver_visibility_test by @kazbeksultanov in [181248](https://github.com/flutter/flutter/pull/181248) +* Remove unnecessary Material import from dialog_test.dart by @kazbeksultanov in [181249](https://github.com/flutter/flutter/pull/181249) +* CupertinoSheetRoute with scrolling and dragging by @MitchellGoodwin in [177337](https://github.com/flutter/flutter/pull/177337) +* Fixes duplicated import in accessibility test library by @chunhtai in [181506](https://github.com/flutter/flutter/pull/181506) +* Make sure that an AnimatedContainer doesn't crash in 0x0 environment by @ahmedsameha1 in [181198](https://github.com/flutter/flutter/pull/181198) +* Make sure that an AnimatedPositionedDirectional doesn't crash in 0x0 … by @ahmedsameha1 in [181451](https://github.com/flutter/flutter/pull/181451) +* Make sure that an AnimatedRotation doesn't crash in 0x0 environment by @ahmedsameha1 in [181486](https://github.com/flutter/flutter/pull/181486) +* Make sure that an ImageIcon doesn't crash in 0x0 environment by @ahmedsameha1 in [181099](https://github.com/flutter/flutter/pull/181099) +* Make sure that an AnimatedAlign doesn't crash in 0x0 environment by @ahmedsameha1 in [181361](https://github.com/flutter/flutter/pull/181361) +* Fix remove material import box decoration test by @kazbeksultanov in [181253](https://github.com/flutter/flutter/pull/181253) +* Make sure that an ImageFiltered doesn't crash at 0x0 environment by @ahmedsameha1 in [181067](https://github.com/flutter/flutter/pull/181067) +* Make sure that an AnimatedPadding doesn't crash in 0x0 environment by @ahmedsameha1 in [181235](https://github.com/flutter/flutter/pull/181235) +* test: Clarify failure messages on gestures/debug_test.dart by @luanpotter in [181109](https://github.com/flutter/flutter/pull/181109) +* feat: add onEnd to AnimatedCrossFade by @rkishan516 in [181455](https://github.com/flutter/flutter/pull/181455) +* [web] Use defensive null check in text editing placeElement by @flutter-zl in [180795](https://github.com/flutter/flutter/pull/180795) +* Add TestWidgetsApp utility and refactor widget tests to use WidgetsApp by @rkishan516 in [180456](https://github.com/flutter/flutter/pull/180456) +* Enhance error handling of WidgetsBindingObserver callbacks by @kazbeksultanov in [181174](https://github.com/flutter/flutter/pull/181174) +* Fix P3-to-sRGB color conversion to operate in linear light by @westito in [181720](https://github.com/flutter/flutter/pull/181720) +* Use null-aware spread in cupertino/app.dart by @brahim-guaali in [181585](https://github.com/flutter/flutter/pull/181585) +* Use null-aware elements in cupertino/list_tile.dart by @brahim-guaali in [181243](https://github.com/flutter/flutter/pull/181243) +* Fix DecoratedSliver sample to avoid antialiasing gap by @brahim-guaali in [179848](https://github.com/flutter/flutter/pull/179848) +* Remove material from basic_test.dart by @navaronbracke in [181444](https://github.com/flutter/flutter/pull/181444) +* Remove material from sliver_tree_test.dart by @navaronbracke in [181415](https://github.com/flutter/flutter/pull/181415) +* feature: implementation of tooltips in the `_TestWindowingOwner` and minor bugfixes to the multiple windows example app by @mattkae in [181510](https://github.com/flutter/flutter/pull/181510) +* Remove unnecessary Material import from cupertino/slider_test.dart by @nathannewyen in [180957](https://github.com/flutter/flutter/pull/180957) +* Remove Material library dependency from expansible_test.dart by @Erengun in [181657](https://github.com/flutter/flutter/pull/181657) +* Fix decorated box by @zemanux in [179802](https://github.com/flutter/flutter/pull/179802) +* Make sure that an AnimatedScale doesn't crash in 0x0 environment by @ahmedsameha1 in [181481](https://github.com/flutter/flutter/pull/181481) +* Propagates Overlay's MediaQueryData to OverlayPortal child by @patrickBillingsley in [181579](https://github.com/flutter/flutter/pull/181579) +* Move CheckedModeBanner tests to material and remove Material import from widgets banner_test by @kazbeksultanov in [181261](https://github.com/flutter/flutter/pull/181261) +* Cleanup cross imports by @yeltayev22 in [181807](https://github.com/flutter/flutter/pull/181807) +* Rename "widgetTester" parameter to "tester" in "WidgetTesterCallback" by @GiancarloCante in [180944](https://github.com/flutter/flutter/pull/180944) +* Add `clearError` API to Form and FormFieldState by @Mairramer in [180752](https://github.com/flutter/flutter/pull/180752) +* Improve accessibility contrast for pre-test message by @ashoknarayan in [180469](https://github.com/flutter/flutter/pull/180469) +* Constrain RawAutocomplete options by soft keyboard by @victorsanni in [181930](https://github.com/flutter/flutter/pull/181930) +* macOS: Implement tooltip window controller by @knopp in [180895](https://github.com/flutter/flutter/pull/180895) +* Update doc in foundation to match the style guide by @chunhtai in [181972](https://github.com/flutter/flutter/pull/181972) +* Update Flutter's style guide for dot shorthands and extension methods by @loic-sharma in [181934](https://github.com/flutter/flutter/pull/181934) +* Improve FlWindowMonitor API by @robert-ancell in [181885](https://github.com/flutter/flutter/pull/181885) +* Refactor accessibility guidelines out to widget layer by @chunhtai in [181672](https://github.com/flutter/flutter/pull/181672) +* Bump Dart to 3.10 by @loic-sharma in [174066](https://github.com/flutter/flutter/pull/174066) +* Encourage splitting large test files in testing documentation 2 by @crackedhandle in [182051](https://github.com/flutter/flutter/pull/182051) +* Remove Material import from focus_traversal_test.dart by @navaronbracke in [180994](https://github.com/flutter/flutter/pull/180994) +* Disable hardware keyboard regularity warning by default by @dkwingsmt in [181894](https://github.com/flutter/flutter/pull/181894) +* Updates to style guide by @Piinks in [181985](https://github.com/flutter/flutter/pull/181985) +* [cupertino/dialog.dart] CupertinoPopupSurface: remove bounded parameter from ImageFilterConfig.blur by @davidhicks980 in [182195](https://github.com/flutter/flutter/pull/182195) +* Cross imports cleanups by @navaronbracke in [181611](https://github.com/flutter/flutter/pull/181611) +* Fix deprecation validator message to require leading v by @ashoknarayan in [180467](https://github.com/flutter/flutter/pull/180467) +* Clean up include paths for Fuchsia in the flutter engine by @mbrase in [182031](https://github.com/flutter/flutter/pull/182031) +* Make HCPP upgrading work for vd/tlhc by @gmackall in [181024](https://github.com/flutter/flutter/pull/181024) +* Fix misleading error message for color/decoration conflict (relands #180325) by @dkwingsmt in [181882](https://github.com/flutter/flutter/pull/181882) +* Mark all `IconData` fields as entrypoints to prevent tree shaking its fields by @mkustermann in [181849](https://github.com/flutter/flutter/pull/181849) +* [web] Fix scroll event bubbling in iframes by @flutter-zl in [179703](https://github.com/flutter/flutter/pull/179703) +* [web] Makes Tappable semantics behavior adaptive by @chunhtai in [182167](https://github.com/flutter/flutter/pull/182167) +* Remove Material dependency from semantics_keep_alive_offstage_test.dart by @gbolahan507 in [182211](https://github.com/flutter/flutter/pull/182211) +* remove MaterialApp import from raw_radio_test.dart by @ilyosbek22 in [181721](https://github.com/flutter/flutter/pull/181721) +* Remove Material dependency from transformed_scrollable_test.dart by @gbolahan507 in [182141](https://github.com/flutter/flutter/pull/182141) +* Standardize on Test* widgets in *_tester.dart files by @justinmc in [182395](https://github.com/flutter/flutter/pull/182395) +* Reverts "Standardize on Test* widgets in *_tester.dart files (#182395)" by @auto-submit[bot] in [182406](https://github.com/flutter/flutter/pull/182406) +* [Web] Fix IME and selection by syncing more text styles by @koji-1009 in [180436](https://github.com/flutter/flutter/pull/180436) +* feat: add routes support in TestWidgetsApp by @rkishan516 in [181695](https://github.com/flutter/flutter/pull/181695) +* Do not wait until dispose before removing replaced/popped page by @victorsanni in [182315](https://github.com/flutter/flutter/pull/182315) +* Refactor: Remove material from actions test by @rkishan516 in [181702](https://github.com/flutter/flutter/pull/181702) +* Remove material from interactive_viewer_test.dart by @navaronbracke in [181465](https://github.com/flutter/flutter/pull/181465) +* Handle#6537 first grouped tests by @ahmedsameha1 in [182077](https://github.com/flutter/flutter/pull/182077) +* docs: fix grammar in animation library documentation by @Akshat-Shuklaaa in [182461](https://github.com/flutter/flutter/pull/182461) +* Remove material imports from Inherited Model, Magnifier, SafeArea, UndoHistory, Navigator and Layers test by @rkishan516 in [181709](https://github.com/flutter/flutter/pull/181709) +* Remove material from ticker mode test by @rkishan516 in [181696](https://github.com/flutter/flutter/pull/181696) +* Remove material from Modal barrier tests by @rkishan516 in [181708](https://github.com/flutter/flutter/pull/181708) +* Refactor autofill_group_test.dart to remove Material dependencies by @gbolahan507 in [181903](https://github.com/flutter/flutter/pull/181903) +* [web] Flutter errors should be reported with console.error() by @mdebbar in [178886](https://github.com/flutter/flutter/pull/178886) +* Replace References to `flutter/engine` with `flutter/flutter` by @AbdeMohlbi in [182600](https://github.com/flutter/flutter/pull/182600) +* Correct PerformanceOverlay optionsMask checks and add tests by @Piinks in [182309](https://github.com/flutter/flutter/pull/182309) +* Fix Chat invite link by @Piinks in [182675](https://github.com/flutter/flutter/pull/182675) +* Add fields getter to FormState by @Mairramer in [180815](https://github.com/flutter/flutter/pull/180815) +* Fix textscaler clamp assertion error by @Valansch in [181716](https://github.com/flutter/flutter/pull/181716) +* [web] scroll iOS iframe text input into view by @flutter-zl in [179759](https://github.com/flutter/flutter/pull/179759) +* refactor: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test by @rkishan516 in [182697](https://github.com/flutter/flutter/pull/182697) +* Refactor: Remove material from ticker provider test by @rkishan516 in [181697](https://github.com/flutter/flutter/pull/181697) +* Fix typo in assert message by @mdebbar in [182843](https://github.com/flutter/flutter/pull/182843) +* Make sure that an AnimatedSlide doesn't crash in 0x0 environment by @ahmedsameha1 in [181535](https://github.com/flutter/flutter/pull/181535) +* Reland Standardize on Test* widgets in *_tester.dart files by @justinmc in [182632](https://github.com/flutter/flutter/pull/182632) +* Reverts "refactor: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test (#182697)" by @auto-submit[bot] in [182879](https://github.com/flutter/flutter/pull/182879) +* Bugfix in the `absorbTicker` method by @nate-thegrate in [181706](https://github.com/flutter/flutter/pull/181706) +* Add toString methods for window positioner classes by @robert-ancell in [182857](https://github.com/flutter/flutter/pull/182857) +* Make positionInlineChildren assert much clearer by @BrainLUX in [182093](https://github.com/flutter/flutter/pull/182093) +* Remove `ExtendSelectionByPageIntent` by @Renzo-Olivares in [182642](https://github.com/flutter/flutter/pull/182642) +* feat: add few required properties to test widgets app by @rkishan516 in [182805](https://github.com/flutter/flutter/pull/182805) +* `WidgetStatesConstraint` as a mixin by @nate-thegrate in [181704](https://github.com/flutter/flutter/pull/181704) +* framework: Use a super-parameter in several missed cases by @srawlins in [182580](https://github.com/flutter/flutter/pull/182580) +* Make sure that a StretchingOverscrollIndicator doesn't crash when it … by @ahmedsameha1 in [182499](https://github.com/flutter/flutter/pull/182499) +* Describe implications of tree-status and Google Testing for PRs by @flar in [182916](https://github.com/flutter/flutter/pull/182916) +* Fix RawAutocomplete crash when options are hidden by @mbcorona in [182785](https://github.com/flutter/flutter/pull/182785) +* Use null-aware elements in widgets/routes.dart by @brahim-guaali in [181242](https://github.com/flutter/flutter/pull/181242) +* Replace an instance of flutter/engine with flutter/flutter by @AbdeMohlbi in [182655](https://github.com/flutter/flutter/pull/182655) +* Fix false positives for hit test misses in flutter_test by @O-Hannonen in [180856](https://github.com/flutter/flutter/pull/180856) +* Resolve inconsistency with SchedulerBinding.scheduleTask usage recomm… by @ahmedsameha1 in [182531](https://github.com/flutter/flutter/pull/182531) +* Add test for WindowPositioner.toString by @robert-ancell in [182906](https://github.com/flutter/flutter/pull/182906) +* [Impeller] Use bilinear filtering for non-uniform scaled text by @sero583 in [182224](https://github.com/flutter/flutter/pull/182224) +* Reland: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test by @rkishan516 in [182891](https://github.com/flutter/flutter/pull/182891) +* [Shortcuts] Improve focus node debug labels by @loic-sharma in [181834](https://github.com/flutter/flutter/pull/181834) +* [Impeller] Remove shared rendering data from TextFrame by @flar in [182886](https://github.com/flutter/flutter/pull/182886) +* [framework] Fix Text.semanticsIdentifier being absorbed by ancestor nodes by @flutter-zl in [181795](https://github.com/flutter/flutter/pull/181795) +* Add desktop review teams by @loic-sharma in [182972](https://github.com/flutter/flutter/pull/182972) +* Make TextDecoration final and unify maskValue across platforms by @SpiralMomentum in [183070](https://github.com/flutter/flutter/pull/183070) +* Improve FFI code for windowing by @robert-ancell in [183098](https://github.com/flutter/flutter/pull/183098) +* Roll pub packages by @flutter-pub-roller-bot in [183133](https://github.com/flutter/flutter/pull/183133) +* [two_dimensional_scrollables] Fix tableview janks when first row/column pinned by @wangfeihang in [180563](https://github.com/flutter/flutter/pull/180563) +* Add await to callsites of BasicMessageChannel.send by @victorsanni in [182868](https://github.com/flutter/flutter/pull/182868) +* Add vmservices for accessibilityEvaluation by @chunhtai in [182791](https://github.com/flutter/flutter/pull/182791) +* [Impeller] Update comments to reflect new info about 2-pass rendering by @flar in [183050](https://github.com/flutter/flutter/pull/183050) +* refactor: remove material in pop_scope_test, route_notification_message_test, two_dimensional_utils, two_dimensional_viewport_test by @rkishan516 in [182699](https://github.com/flutter/flutter/pull/182699) +* refactor: remove material in reorderable_list_test, scroll_notification_test, scroll_physics_test, shortcuts_test, sliver_floating_header_test, snapshot_widget_test by @rkishan516 in [182698](https://github.com/flutter/flutter/pull/182698) +* Fixes FocusHighlightMode on Android when typing in software keyboard by @romaingyh in [180753](https://github.com/flutter/flutter/pull/180753) +* Re-specify the ndk version in various test apps, to prevent ndk download by @gmackall in [183134](https://github.com/flutter/flutter/pull/183134) +* Add `UnlabaledLeafNodeEvaluation` by @QuncCccccc in [182872](https://github.com/flutter/flutter/pull/182872) +* refactor: remove material from widget_inspector_test, sliver_cross_axis_group_test, editable_text_show_on_screen_test, scrollable_fling_test, selection_container_test by @rkishan516 in [182702](https://github.com/flutter/flutter/pull/182702) +* Add AI contribution guidelines by @stuartmorgan-g in [183326](https://github.com/flutter/flutter/pull/183326) +* Revert "Make HCPP upgrading work for vd/tlhc (#181024)" by @camsim99 in [183310](https://github.com/flutter/flutter/pull/183310) +* refactor: remove material import from animated_cross_fade, physical_model_test, pinned_header_sliver_test, spell_check_test by @rkishan516 in [183234](https://github.com/flutter/flutter/pull/183234) +* Add await or ignore lint to flutter_driver unawaited callsites by @victorsanni in [183334](https://github.com/flutter/flutter/pull/183334) +* Adds geometry dirty nodes by @chunhtai in [180375](https://github.com/flutter/flutter/pull/180375) +* refactor: remove material from baseline_test, slivers_test by @rkishan516 in [183367](https://github.com/flutter/flutter/pull/183367) +* refactor: remove material imports from system_context_menu_test, table_test by @rkishan516 in [183368](https://github.com/flutter/flutter/pull/183368) +* Standardize review timeline guidance by @stuartmorgan-g in [183465](https://github.com/flutter/flutter/pull/183465) +* Reapply "Make HCPP upgrading work for vd/tlhc (#181024)" (#183310) by @gmackall in [183360](https://github.com/flutter/flutter/pull/183360) +* Add scrollCacheExtent to PageView by @koji-1009 in [180411](https://github.com/flutter/flutter/pull/180411) +* [integration_test]UIScene Migration by @okorohelijah in [182631](https://github.com/flutter/flutter/pull/182631) +* [ios][engine] Fix keyboard flicker when switching text fields by @koji-1009 in [182661](https://github.com/flutter/flutter/pull/182661) +* Adding the SatelliteWindowController interface to `_window.dart` by @mattkae in [182903](https://github.com/flutter/flutter/pull/182903) +* refactor: remove material import from sliver_resizing_header_test and sliver_prototype_item_extent_test by @rkishan516 in [183562](https://github.com/flutter/flutter/pull/183562) +* Fix PinnedHeaderSliver semantics focus capture by @manu-sncf in [179023](https://github.com/flutter/flutter/pull/179023) +* Made complex_layout_scroll_perf explicitly skia by @gaaclarke in [183663](https://github.com/flutter/flutter/pull/183663) +* Fix RouteAware.didPushNext documentation inaccuracy by @ishaquehassan in [183097](https://github.com/flutter/flutter/pull/183097) +* [flutter_tools] Avoid File.exists and File.stat, as per enforced lint rule by @srawlins in [183463](https://github.com/flutter/flutter/pull/183463) +* Adds macos impeller complex layout performance test by @gaaclarke in [183669](https://github.com/flutter/flutter/pull/183669) +* Fix widget inspector control layout and add safe area regression test by @gktirkha in [180789](https://github.com/flutter/flutter/pull/180789) +* Remove obsolete null checks from style guide by @nate-thegrate in [181703](https://github.com/flutter/flutter/pull/181703) +* Handle#6537 second grouped test by @ahmedsameha1 in [182529](https://github.com/flutter/flutter/pull/182529) +* (Test cross-imports) Remove legacy Material import from sliver_constraints_test by @mayanksharma9 in [183351](https://github.com/flutter/flutter/pull/183351) +* Fix url to the Flutter System Overview diagram. by @algor in [183680](https://github.com/flutter/flutter/pull/183680) +* [152588] Fix Scrollable being too eager to respond to pointer signals by @O-Hannonen in [183302](https://github.com/flutter/flutter/pull/183302) +* Allow windows to be created undecorated by @robert-ancell in [179859](https://github.com/flutter/flutter/pull/179859) +* Add non-text color contrast evaluation for a11y by @QuncCccccc in [183569](https://github.com/flutter/flutter/pull/183569) +* Update the windowing docs per the latest wording found while doing Satellites by @mattkae in [183748](https://github.com/flutter/flutter/pull/183748) +* Roll pub packages by @flutter-pub-roller-bot in [183895](https://github.com/flutter/flutter/pull/183895) +* Use Color.a instead of Color.alpha to assert the opacity of the color… by @ahmedsameha1 in [184003](https://github.com/flutter/flutter/pull/184003) +* Mark `IconData` `final` and `@mustBeConst` by @dcharkes in [181345](https://github.com/flutter/flutter/pull/181345) +* Fix RenderStack's documentation by @AbdeMohlbi in [183822](https://github.com/flutter/flutter/pull/183822) +* [flutter_goldens] Remove dead check on null being in a list of non-nullables by @srawlins in [183938](https://github.com/flutter/flutter/pull/183938) +* SelectableRegion should passthrough constraints to child unmodified by @Renzo-Olivares in [184083](https://github.com/flutter/flutter/pull/184083) +* Add SensitiveContent widget sample code by @huycozy in [183846](https://github.com/flutter/flutter/pull/183846) +* Add widget of the week link in SensitiveContent documentation by @ValentinVignal in [183972](https://github.com/flutter/flutter/pull/183972) +* Pipes ScrollCacheExtent through more scroll views by @chunhtai in [184078](https://github.com/flutter/flutter/pull/184078) +* Updates scroll cache extent doc by @chunhtai in [184142](https://github.com/flutter/flutter/pull/184142) +* skip interactive keyboard tests by @okorohelijah in [183757](https://github.com/flutter/flutter/pull/183757) +* flutter_driver: remove @internal annotation on field by @kevmoo in [184235](https://github.com/flutter/flutter/pull/184235) +* feat(web): unify CanvasKit and Skwasm garbage collection by @harryterkelsen in [183867](https://github.com/flutter/flutter/pull/183867) +* Add alwaysSizeToContent argument to Overlay. by @knopp in [182009](https://github.com/flutter/flutter/pull/182009) +* fixes crash when invisible semantics nodes dropped from semantics tree by @chunhtai in [184226](https://github.com/flutter/flutter/pull/184226) +* Add title evaluation by @QuncCccccc in [184084](https://github.com/flutter/flutter/pull/184084) +* [web] Fix autofill in iOS 26 Safari by @mdebbar in [182024](https://github.com/flutter/flutter/pull/182024) +* Handle#6537 third grouped tests by @ahmedsameha1 in [183059](https://github.com/flutter/flutter/pull/183059) +* Fix layout overflowed in small screen in SensitiveContent's example by @huycozy in [184179](https://github.com/flutter/flutter/pull/184179) +* Update style guide by @Piinks in [184478](https://github.com/flutter/flutter/pull/184478) +* Add await or ignore to future-returning methods defined in Dart SDK by @victorsanni in [184229](https://github.com/flutter/flutter/pull/184229) +* Implement popup windows for macOS by @knopp in [182371](https://github.com/flutter/flutter/pull/182371) +* Implement tooltip windows on Linux by @robert-ancell in [182348](https://github.com/flutter/flutter/pull/182348) +* Handle events without a device by @robert-ancell in [184163](https://github.com/flutter/flutter/pull/184163) +* Reduce number of mallocs in FFI call by @robert-ancell in [184166](https://github.com/flutter/flutter/pull/184166) +* Remove isSizedToContent from _window_linux.dart. by @knopp in [184506](https://github.com/flutter/flutter/pull/184506) +* Fix line breaks being lost when copying after selection gesture in SelectableRegion by @Renzo-Olivares in [184421](https://github.com/flutter/flutter/pull/184421) +* [Dot shorthands] Migrate examples/api/lib/cupertino by @loic-sharma in [183964](https://github.com/flutter/flutter/pull/183964) +* refactor: remove material from list_view_viewporting_test and page_forward_transitions_test by @rkishan516 in [183564](https://github.com/flutter/flutter/pull/183564) +* refactor: remove material from color and image filter test by @rkishan516 in [183563](https://github.com/flutter/flutter/pull/183563) +* Keep last character obscured when toggling obscureText by @TrangLeQuynh in [183488](https://github.com/flutter/flutter/pull/183488) +* Use the WindowRegistry in the multiple_windows example app by @mattkae in [184579](https://github.com/flutter/flutter/pull/184579) +* Add Support For Built-in Kotlin by @jesswrd in [184227](https://github.com/flutter/flutter/pull/184227) +* Revert "Add Support For Built-in Kotlin (#184227)" by @Renzo-Olivares in [184739](https://github.com/flutter/flutter/pull/184739) +* [Semantics] clarify Android header docs by @mayanksharma9 in [183573](https://github.com/flutter/flutter/pull/183573) +* [Dot shorthands] Migrate examples/api/lib/widgets by @loic-sharma in [183965](https://github.com/flutter/flutter/pull/183965) +* Code freeze workflow by @Piinks in [184246](https://github.com/flutter/flutter/pull/184246) +* [Re-land] Add Support For Built-in Kotlin by @jesswrd in [184745](https://github.com/flutter/flutter/pull/184745) +* Refactor: remove material from absorb_ponter_test, container_test, lookup_boundary_test, page_view_test, router_test, semantics_clipping_test, semantics_merge_test, shadow_test, text_test by @rkishan516 in [183309](https://github.com/flutter/flutter/pull/183309) +* Even more awaits v2 by @victorsanni in [184552](https://github.com/flutter/flutter/pull/184552) +* Remove navigator_utils cross-imports from cupertino tests by @xfce0 in [184282](https://github.com/flutter/flutter/pull/184282) +* Add await or ignore lint to invokeMethod callsites by @victorsanni in [182870](https://github.com/flutter/flutter/pull/182870) +* [Dot shorthands] Migrate examples/api/test by @loic-sharma in [183966](https://github.com/flutter/flutter/pull/183966) +* Warn about the use of TestSemantics by @justinmc in [184369](https://github.com/flutter/flutter/pull/184369) +* [CP-beta]Fix an ordering dependency in the services/system_chrome_test.dart test suite by @flutteractionsbot in [185104](https://github.com/flutter/flutter/pull/185104) + +### Material + +* Fix typo in dropdown_menu.dart by @Koichi5 in [180172](https://github.com/flutter/flutter/pull/180172) +* [A11y ] Add `clearSemantics`in table by @hannah-hyj in [180665](https://github.com/flutter/flutter/pull/180665) +* Add TabBar API example for scroll notification integration by @huycozy in [180728](https://github.com/flutter/flutter/pull/180728) +* Fix RangeSlider dragged cursor handling. by @ksokolovskyi in [179988](https://github.com/flutter/flutter/pull/179988) +* Update localizations from translation console by @QuncCccccc in [180997](https://github.com/flutter/flutter/pull/180997) +* clean up usages of resetXyz for TestFlutterView by @navaronbracke in [180840](https://github.com/flutter/flutter/pull/180840) +* Fix vertical SegmentedButton not filling available width under bounded constraints by @Mairramer in [180701](https://github.com/flutter/flutter/pull/180701) +* fix: clip ink highlights in NavigationDrawer when footer is present by @ikramhasan in [181050](https://github.com/flutter/flutter/pull/181050) +* Add leadingIndex to CarouselController and onItemChanged to CarouselView by @Mairramer in [180667](https://github.com/flutter/flutter/pull/180667) +* [Material] update hourFormat to use Dart 3 switch expression by @Enderjua in [181041](https://github.com/flutter/flutter/pull/181041) +* Fixes Typo in codebase by @srivats22 in [181256](https://github.com/flutter/flutter/pull/181256) +* Broaden the applicability of `Color` fix_data rules from flutter/painting.dart by @b-luk in [181093](https://github.com/flutter/flutter/pull/181093) +* Revert DropdownMenu non-nullable breaking change by @Gustl22 in [181074](https://github.com/flutter/flutter/pull/181074) +* Add bottom navigation bar item semantics label by @Lilian-C in [180577](https://github.com/flutter/flutter/pull/180577) +* Reset TextFormField to initial value after state change by @Mairramer in [181199](https://github.com/flutter/flutter/pull/181199) +* [Material] modernize Typography._withPlatform with Dart 3 switch expression by @Enderjua in [181398](https://github.com/flutter/flutter/pull/181398) +* Add `alignment` to `SizeTransition` by @IvoneDjaja in [177895](https://github.com/flutter/flutter/pull/177895) +* Fix Range Slider issue where indescrete ranges lead to out of range r… by @chris-prenissl in [181082](https://github.com/flutter/flutter/pull/181082) +* [Material] modernize time picker components with Dart 3 switch expressions by @Enderjua in [181356](https://github.com/flutter/flutter/pull/181356) +* feat: add RoundedSuperellipseInputBorder by @rkishan516 in [177220](https://github.com/flutter/flutter/pull/177220) +* Fix `todayBorder` todayBorder color is incorrectly overridden by `todayForegroundColor` in CalendarDatePicker by @huycozy in [178792](https://github.com/flutter/flutter/pull/178792) +* test: Improve DropdownMenuFormField tests by @Gustl22 in [181369](https://github.com/flutter/flutter/pull/181369) +* Send statusBarTouch events via dedicated messages by @LongCatIsLooong in [179643](https://github.com/flutter/flutter/pull/179643) +* [material/menu_anchor.dart] Add animations to MenuAnchor. by @davidhicks980 in [176494](https://github.com/flutter/flutter/pull/176494) +* Add isDark, isLight, and isSystem getters to ThemeMode by @Turskyi in [181475](https://github.com/flutter/flutter/pull/181475) +* Deprecate onReorder callback by @navaronbracke in [178242](https://github.com/flutter/flutter/pull/178242) +* Add `TestTextField` and migrate tests by @Renzo-Olivares in [180494](https://github.com/flutter/flutter/pull/180494) +* 180162 fix radio list tile and switch list tile accept widget states controller by @AnishTiwari5077 in [180367](https://github.com/flutter/flutter/pull/180367) +* Use null-aware spread in material/app.dart by @brahim-guaali in [181586](https://github.com/flutter/flutter/pull/181586) +* Use null-aware elements in material/dialog.dart by @brahim-guaali in [181244](https://github.com/flutter/flutter/pull/181244) +* Remove material from slivers_appbar_floating_pinned_test.dart + slivers_appbar_stretch_test.dart + sliver_persistent_header_test.dart + slivers_appbar_floating_test.dart by @navaronbracke in [181469](https://github.com/flutter/flutter/pull/181469) +* Reduce reliance on Material in page_transitions_test.dart by @navaronbracke in [181467](https://github.com/flutter/flutter/pull/181467) +* Remove material from scrollable_helpers_test.dart by @navaronbracke in [181460](https://github.com/flutter/flutter/pull/181460) +* feat: Pass parameters from DropdownMenuFormField to DropDownMenu by @Gustl22 in [181373](https://github.com/flutter/flutter/pull/181373) +* [Material] Remove Material import from backdrop_filter_test.dart widget tests by @kazbeksultanov in [181386](https://github.com/flutter/flutter/pull/181386) +* [cupertino.dart] Implement CupertinoMenuAnchor and CupertinoMenuItem using RawMenuAnchor by @davidhicks980 in [174695](https://github.com/flutter/flutter/pull/174695) +* Reverts "[cupertino.dart] Implement CupertinoMenuAnchor and CupertinoMenuItem using RawMenuAnchor (#174695)" by @auto-submit[bot] in [182010](https://github.com/flutter/flutter/pull/182010) +* fix: OutlineInputBorder not respecting BorderSide stroke alignment by @ikramhasan in [180487](https://github.com/flutter/flutter/pull/180487) +* Introduce ScrollCacheExtent and also fixes unbound shrinkwrap cache ex… by @chunhtai in [181092](https://github.com/flutter/flutter/pull/181092) +* refactor: migrate CupertinoPageTransitionsBuilder to cupertino folder by @rkishan516 in [179776](https://github.com/flutter/flutter/pull/179776) +* Update date localization by @QuncCccccc in [181685](https://github.com/flutter/flutter/pull/181685) +* Reverts "Update date localization (#181685)" by @auto-submit[bot] in [182182](https://github.com/flutter/flutter/pull/182182) +* Reland - Update date localization by @QuncCccccc in [182189](https://github.com/flutter/flutter/pull/182189) +* Revert "Send statusBarTouch events via dedicated messages (#179643)" by @vashworth in [182223](https://github.com/flutter/flutter/pull/182223) +* Enhance the Stepper widget by adding customizable header and content padding by @safwanidrees in [180257](https://github.com/flutter/flutter/pull/180257) +* [Material] modernize legacy switch statements to expressions across multiple files by @Enderjua in [181427](https://github.com/flutter/flutter/pull/181427) +* Preparation to add contentTextStyle flag to SimpleDialog. by @chingjun in [182200](https://github.com/flutter/flutter/pull/182200) +* Fix cross imports for all Cupertino tests by @navaronbracke in [181634](https://github.com/flutter/flutter/pull/181634) +* Add await to tester.pump callsites by @victorsanni in [182398](https://github.com/flutter/flutter/pull/182398) +* Reverts "Fix cross imports for all Cupertino tests (#181634)" by @auto-submit[bot] in [182404](https://github.com/flutter/flutter/pull/182404) +* [Reland] Cupertino cross imports by @navaronbracke in [182416](https://github.com/flutter/flutter/pull/182416) +* Add contentTextStyle support to SimpleDialog by @777genius in [178824](https://github.com/flutter/flutter/pull/178824) +* [a11y] RangeSlider mouse interaction should change keyboard focus by @hannah-hyj in [182185](https://github.com/flutter/flutter/pull/182185) +* Clean up cross imports in single_child_scroll_view_test.dart, decorated_sliver_test.dart, draggable_scrollable_sheet_test.dart by @navaronbracke in [181613](https://github.com/flutter/flutter/pull/181613) +* Allow TabBar to receive a TabBarScrollController by @navaronbracke in [180389](https://github.com/flutter/flutter/pull/180389) +* [web] Pass form validation errors to screen readers via aria-description by @flutter-zl in [180556](https://github.com/flutter/flutter/pull/180556) +* Fixing ExpansionTile expandedAlignment not Accepts AlignmentGeometry … by @devnoaman in [180814](https://github.com/flutter/flutter/pull/180814) +* Fix(Material): DateRangePicker ignores DatePickerTheme.dayShape by @akhil-ge0rge in [181658](https://github.com/flutter/flutter/pull/181658) +* Move SelectionArea web test from widgets to material folder by @gbolahan507 in [181951](https://github.com/flutter/flutter/pull/181951) +* Add RawTooltip.ignorePointer by @victorsanni in [182527](https://github.com/flutter/flutter/pull/182527) +* Remove Material import from scroll_view_test.dart by @navaronbracke in [181281](https://github.com/flutter/flutter/pull/181281) +* Reland #179643, only scroll hit-testable primary scroll views on status bar tap by @LongCatIsLooong in [182391](https://github.com/flutter/flutter/pull/182391) +* Add cupertino docimports for CupertinoPageTransitionsBuilder and fix typos by @victorsanni in [182685](https://github.com/flutter/flutter/pull/182685) +* Shortcircuit if Tooltip message and richMessage are empty by @victorsanni in [182524](https://github.com/flutter/flutter/pull/182524) +* Carousel: Migration from Scrollable+Viewport to CustomScrollView by @Mairramer in [182475](https://github.com/flutter/flutter/pull/182475) +* Use AnimationStyle curve and reverseCurve in ModalBottomSheet animation by @Mairramer in [181403](https://github.com/flutter/flutter/pull/181403) +* Add WidgetStatesController support to ExpansionTile by @iamvikashtiwari in [181238](https://github.com/flutter/flutter/pull/181238) +* Factor out unnecessary `assert`s by @nate-thegrate in [182042](https://github.com/flutter/flutter/pull/182042) +* Updates MenuAnchor to respect software keyboard by @patrickBillingsley in [180975](https://github.com/flutter/flutter/pull/180975) +* Remove some instances of useMaterial3: true by @AbdeMohlbi in [182944](https://github.com/flutter/flutter/pull/182944) +* `SizedBox.square()` by @nate-thegrate in [182731](https://github.com/flutter/flutter/pull/182731) +* [A11y] in calendar date picker, remove SemanticsService.sendAnnouncement usage for android. by @hannah-hyj in [182918](https://github.com/flutter/flutter/pull/182918) +* Add warning when there is a widget with color between `Material` and `ListTile` by @QuncCccccc in [181402](https://github.com/flutter/flutter/pull/181402) +* Eliminate rebuilds for Scaffold FAB animation by @nate-thegrate in [182331](https://github.com/flutter/flutter/pull/182331) +* Add await to flutter_test callsites by @victorsanni in [182983](https://github.com/flutter/flutter/pull/182983) +* Windowing implementation of `showDialog` that uses a native desktop window to display the content by @mattkae in [181861](https://github.com/flutter/flutter/pull/181861) +* Add fallbackColor for PredictiveBackPageTransitionBuilder and PredictiveBackFullscreenPageTransitionBuilder by @victorsanni in [182690](https://github.com/flutter/flutter/pull/182690) +* Add displayCornerRadii support to predictive back transitions. by @ksokolovskyi in [181326](https://github.com/flutter/flutter/pull/181326) +* Remove material from scrollable_test.dart by @navaronbracke in [181429](https://github.com/flutter/flutter/pull/181429) +* [material/menu_anchor.dart] Ensure positioned menus always begin animating at the target position by @davidhicks980 in [182932](https://github.com/flutter/flutter/pull/182932) +* Add awaits to dev/ callsites by @victorsanni in [183479](https://github.com/flutter/flutter/pull/183479) +* Fix reselection issue after the text is cleared by @QuncCccccc in [183545](https://github.com/flutter/flutter/pull/183545) +* Add await to more flutter/flutter callsites by @victorsanni in [183413](https://github.com/flutter/flutter/pull/183413) +* Add awaits to flutter/test callsites by @victorsanni in [183487](https://github.com/flutter/flutter/pull/183487) +* Add mainAxisAlignment to NavigationRail by @mbcorona in [183514](https://github.com/flutter/flutter/pull/183514) +* Framework: Improve DropdownButton selectedItemBuilder assertion by @mbcorona in [183732](https://github.com/flutter/flutter/pull/183732) +* Add a Clarification for the docs of suggestionsBuilder of SearchAnchor by @ahmedsameha1 in [183106](https://github.com/flutter/flutter/pull/183106) +* Fixes animation glitch into bottom sheet by @Mairramer in [183303](https://github.com/flutter/flutter/pull/183303) +* [Slider] Refactor test "Value indicator appears when it should" by @dkwingsmt in [183143](https://github.com/flutter/flutter/pull/183143) +* Fix Semantics expanded state not updating in PopupMenuButton and DropdownButton by @AhmedLSayed9 in [183475](https://github.com/flutter/flutter/pull/183475) +* Replace BorderRadius.circular with const BorderRadius.all and update documentation examples by @BrainLUX in [183074](https://github.com/flutter/flutter/pull/183074) +* Add assert for mutually exclusive errorBuilder and errorText by @muradhossin in [183901](https://github.com/flutter/flutter/pull/183901) +* Add scrollPadding property to DropdownMenu by @ishaquehassan in [183109](https://github.com/flutter/flutter/pull/183109) +* [Slider] Remove value indicator painter when animation is dismissed by @dkwingsmt in [182991](https://github.com/flutter/flutter/pull/182991) +* Refactor layout dimensions by @Piinks in [184066](https://github.com/flutter/flutter/pull/184066) +* [Dot shorthands] Migrate examples/api/lib/material by @loic-sharma in [183963](https://github.com/flutter/flutter/pull/183963) +* feat: add infinite carousel support by @rkishan516 in [175710](https://github.com/flutter/flutter/pull/175710) +* For ShapeBorder instances with preferPaintInterior=true, use paintInterior rather than drawing the path from getOuterPath. by @b-luk in [184258](https://github.com/flutter/flutter/pull/184258) +* Reland "Fix Slider semantics node size" with some changes by @hannah-hyj in [184168](https://github.com/flutter/flutter/pull/184168) +* Update TabBar documentation to clarify indicatorWeight behavior by @saurabh-mirajkar in [184104](https://github.com/flutter/flutter/pull/184104) +* Even more awaits by @victorsanni in [184042](https://github.com/flutter/flutter/pull/184042) +* Revert "Even more awaits (#184042)" by @gaaclarke in [184429](https://github.com/flutter/flutter/pull/184429) +* Add bottom safe area padding to licenses package license page by @sysint64 in [182425](https://github.com/flutter/flutter/pull/182425) +* [ios] Add opt-in inline prediction text input support by @nikb7 in [183650](https://github.com/flutter/flutter/pull/183650) +* Replace usages of `MediaQuery.of(context).property` with `MediaQuery.propertyOf(context)` by @AbdeMohlbi in [184211](https://github.com/flutter/flutter/pull/184211) +* Remove sliver_test_utils cross-import from sliver_app_bar_test by @Sanaullah49 in [184193](https://github.com/flutter/flutter/pull/184193) +* Reland "Even more awaits" by @victorsanni in [184467](https://github.com/flutter/flutter/pull/184467) +* Remove live_text_utils cross-imports from material and cupertino tests by @xfce0 in [184517](https://github.com/flutter/flutter/pull/184517) +* [A11y] Allow percentage strings like "50%" as `SemanticsValue` for `ProgressIndicator` by @hannah-hyj in [183670](https://github.com/flutter/flutter/pull/183670) +* Use full goto.google.com hostname for go/ links by @b-luk in [184679](https://github.com/flutter/flutter/pull/184679) +* [widgets/raw_menu_anchor.dart] Always call onClose and onCloseRequested on descendants before parent. by @davidhicks980 in [182357](https://github.com/flutter/flutter/pull/182357) +* Update localization from translation console by @QuncCccccc in [184742](https://github.com/flutter/flutter/pull/184742) +* [cupertino.dart] Implement CupertinoMenuAnchor and CupertinoMenuItem using RawMenuAnchor by @davidhicks980 in [182036](https://github.com/flutter/flutter/pull/182036) +* Remove editable_text_utils cross-imports from material and cupertino … by @xfce0 in [184519](https://github.com/flutter/flutter/pull/184519) +* Add more error handling to unawaited callsites by @victorsanni in [184526](https://github.com/flutter/flutter/pull/184526) + +### iOS + +* Fix iOS xattr removal to clear all extended attributes by @Saqib198 in [180355](https://github.com/flutter/flutter/pull/180355) +* Reverts "Fix iOS xattr removal to clear all extended attributes (#180355)" by @auto-submit[bot] in [180709](https://github.com/flutter/flutter/pull/180709) +* Implement macOS wide gamut (Display P3) support by @westito in [181769](https://github.com/flutter/flutter/pull/181769) +* Intercept UIScene device log and print a guided warning by @vashworth in [181515](https://github.com/flutter/flutter/pull/181515) +* Give guided error message when CocoaPod and SwiftPM dependency conflicts by @vashworth in [182392](https://github.com/flutter/flutter/pull/182392) +* Remove specific iOS extended attributes to fix code signing by @Saqib198 in [180710](https://github.com/flutter/flutter/pull/180710) +* Remove FlutterFramework app migration by @vashworth in [182100](https://github.com/flutter/flutter/pull/182100) +* flutter#182361 Fix delegate copy on plugins init by @eMxPi in [182362](https://github.com/flutter/flutter/pull/182362) +* Re-add extended attribute removed by SwiftPM by @vashworth in [183011](https://github.com/flutter/flutter/pull/183011) +* Exclude arm64 if any dependencies do and print warning when using Xcode 26 by @vashworth in [182913](https://github.com/flutter/flutter/pull/182913) +* Add missing mutation-safe delegate iteration and use idomatic syntax by @vashworth in [183018](https://github.com/flutter/flutter/pull/183018) +* Improve SwiftPM minimum platform mismatch diagnostics by @MohammedTarigg in [182375](https://github.com/flutter/flutter/pull/182375) +* Add warning for plugins not migrated to UIScene by @okorohelijah in [182826](https://github.com/flutter/flutter/pull/182826) +* [iOS] Skip gesture recognizer reset workaround on iOS 26+ by @okorohelijah in [183186](https://github.com/flutter/flutter/pull/183186) +* Implements `ClipRSuperellipse` on backdrop filter on platform view by @Hari-07 in [182643](https://github.com/flutter/flutter/pull/182643) +* Roll Clang to 80743bd43fd5b38fedc503308e7a652e23d3ec93 by @jason-simmons in [182919](https://github.com/flutter/flutter/pull/182919) +* Adds switch for sdf rendering plus golden tests by @gaaclarke in [183543](https://github.com/flutter/flutter/pull/183543) +* [ios][pv]fix admob banner scrollable on ios 18.2 by @hellohuanlin in [183274](https://github.com/flutter/flutter/pull/183274) +* Codesign XCFrameworks for darwin add to app by @vashworth in [183399](https://github.com/flutter/flutter/pull/183399) +* Add ability to access plugins from other plugins by @fuzzybinary in [182753](https://github.com/flutter/flutter/pull/182753) +* Filter out .appex extension processes from LLDB attachment on iOS 17+ by @Silfalion in [183724](https://github.com/flutter/flutter/pull/183724) +* Remove workaround for fake impeller images in iOS simulator. by @eyebrowsoffire in [184264](https://github.com/flutter/flutter/pull/184264) +* Warn about slow SwiftPM downloads and centralize SwiftPM cache by @vashworth in [183747](https://github.com/flutter/flutter/pull/183747) +* Add plugin version to SwiftPM package symlink directory by @vashworth in [183668](https://github.com/flutter/flutter/pull/183668) +* Add integration scripts and tools for SwiftPM add to app by @vashworth in [184204](https://github.com/flutter/flutter/pull/184204) +* Fix invisible accessibility element before scroll view by @LouiseHsu in [184155](https://github.com/flutter/flutter/pull/184155) +* Manually stop and continue LLDB breakpoints on Xcode 26.4+ by @vashworth in [184690](https://github.com/flutter/flutter/pull/184690) +* [CP-beta]Disable async mode with LLDB by @vashworth in [185102](https://github.com/flutter/flutter/pull/185102) +* [CP-beta]Fix killing wrong xcrun command by @flutteractionsbot in [185097](https://github.com/flutter/flutter/pull/185097) +* [CP-beta]Only use LLDB breakpoint in debug mode by @flutteractionsbot in [185343](https://github.com/flutter/flutter/pull/185343) +* [CP-beta][SwiftPM] Enable package resolution on xcodebuild commands by @flutteractionsbot in [185746](https://github.com/flutter/flutter/pull/185746) + +### Android + +* Re-prioritize pipeline compile jobs and perform them eagerly instead of waiting. by @chinmaygarde in [180022](https://github.com/flutter/flutter/pull/180022) +* Improve code quality in `BinaryMessenger.java` by @AbdeMohlbi in [180733](https://github.com/flutter/flutter/pull/180733) +* Fix `documentation member not recognized` because of missing import in `FlutterEngine.java` by @AbdeMohlbi in [180731](https://github.com/flutter/flutter/pull/180731) +* Update `PlatformPlugin` to not call `setStatusBarColor`, `setNavigationBarColor`, `setNavigationBarDividerColor` when disabled by @AbdeMohlbi in [180061](https://github.com/flutter/flutter/pull/180061) +* Removes `RequiresApi 23` by @AbdeMohlbi in [180629](https://github.com/flutter/flutter/pull/180629) +* Fix hcpp flicker when scrolling off/on screen by @gmackall in [181009](https://github.com/flutter/flutter/pull/181009) +* Remove unnecessary `String.valueOf` in `FlutterJNI.java` by @AbdeMohlbi in [180995](https://github.com/flutter/flutter/pull/180995) +* Remove unnecessary `Integer.toString` in `FlutterShellArgs.java` by @AbdeMohlbi in [180993](https://github.com/flutter/flutter/pull/180993) +* Improve code quality in `ViewUtils.java` by @AbdeMohlbi in [181147](https://github.com/flutter/flutter/pull/181147) +* Remove unused `UrlStringAttribute` class by @AbdeMohlbi in [181146](https://github.com/flutter/flutter/pull/181146) +* Improve code quality in `PlatformViewsController.java` by @AbdeMohlbi in [181338](https://github.com/flutter/flutter/pull/181338) +* Remove unused `ActivityLifecycleListener` class by @AbdeMohlbi in [181406](https://github.com/flutter/flutter/pull/181406) +* Fix Gradle path in Android Platform Embedder README. by @ksokolovskyi in [181501](https://github.com/flutter/flutter/pull/181501) +* [Reland] Don't strip symbols from `libapp.so` on android by default by @gmackall in [181275](https://github.com/flutter/flutter/pull/181275) +* Remove unused code paths in `PlatformViewsController.java` by @AbdeMohlbi in [181393](https://github.com/flutter/flutter/pull/181393) +* [ Tool / Engine ] Cleanup x86 references by @bkonyi in [181152](https://github.com/flutter/flutter/pull/181152) +* Reverts "[ Tool / Engine ] Cleanup x86 references (#181152)" by @auto-submit[bot] in [181643](https://github.com/flutter/flutter/pull/181643) +* Ensure content-sizing resize is run on UI thread by @mboetger in [181686](https://github.com/flutter/flutter/pull/181686) +* [Android] Add predictive back support for FlutterFragment and FlutterFragmentActivity by @moko256 in [181124](https://github.com/flutter/flutter/pull/181124) +* Add exception to log message in ContentSizingFlag.java by @reidbaker in [181813](https://github.com/flutter/flutter/pull/181813) +* [Android] Add mechanism for setting Android engine flags via Android manifest (take 2) by @camsim99 in [181632](https://github.com/flutter/flutter/pull/181632) +* [a11y][android] Set new CheckState APIs for android API 36 by @hannah-hyj in [182113](https://github.com/flutter/flutter/pull/182113) +* fix(android): add null check for textInputPlugin in FlutterView by @LailaiMaster in [180386](https://github.com/flutter/flutter/pull/180386) +* Ensure resize listener is not added if content sizing is not turned on by @mboetger in [182168](https://github.com/flutter/flutter/pull/182168) +* [native_assets] Fix `flutter build ios-framework` by @dcharkes in [181507](https://github.com/flutter/flutter/pull/181507) +* Revert "[Android] Add mechanism for setting Android engine flags via … by @camsim99 in [182388](https://github.com/flutter/flutter/pull/182388) +* Migrate abi build paths to use new abi filtering api #AGP9 by @reidbaker in [181828](https://github.com/flutter/flutter/pull/181828) +* Remove unused `getPluginList ` by @AbdeMohlbi in [182660](https://github.com/flutter/flutter/pull/182660) +* fix-huawei-imagereader-166481 by @serbandin in [181931](https://github.com/flutter/flutter/pull/181931) +* Add a cli flag for toggling HCPP use, and enable it by @gmackall in [182516](https://github.com/flutter/flutter/pull/182516) +* [Android] Avoid plugin auto-registration during FlutterFragmentActivity recreate timing window by @littleGnAl in [182963](https://github.com/flutter/flutter/pull/182963) +* Fix input mirroring in platform views when system language is RTL, and support is set in manifest. by @gmackall in [183472](https://github.com/flutter/flutter/pull/183472) +* Rename hcpp opt in flag to `enable-hcpp` by @gmackall in [183151](https://github.com/flutter/flutter/pull/183151) +* [a11y][android] In Android 16, sendWindowContentChangeEvent when check state changes by @hannah-hyj in [183606](https://github.com/flutter/flutter/pull/183606) +* Reland "[Android] Add mechanism for setting Android engine flags via Android manifest (take 2)" by @camsim99 in [182522](https://github.com/flutter/flutter/pull/182522) +* [skia] Disable use of deprecated Mock GrBackendSurface by @kjlubick in [183731](https://github.com/flutter/flutter/pull/183731) +* Fix Content Sizing Race Condition by @mboetger in [182326](https://github.com/flutter/flutter/pull/182326) +* Migrate `addTaskForPrintBuildVariants` and `isFlutterAppProject` to new agp dsl by @gmackall in [183849](https://github.com/flutter/flutter/pull/183849) +* Migrate profile build type creation and proguard config to new dsl by @gmackall in [183856](https://github.com/flutter/flutter/pull/183856) +* [android][a11y] set "android.widget.ProgressBar" according to semantics role by @hannah-hyj in [183897](https://github.com/flutter/flutter/pull/183897) +* Adds rockchip series to block list for vulkan. by @gaaclarke in [184207](https://github.com/flutter/flutter/pull/184207) +* [AGP 9] Bumping KGP error minimum to 2.0.0 by @jesswrd in [184385](https://github.com/flutter/flutter/pull/184385) +* [Android] Use EdgeToEdge.enable/WindowCompat for edge-to-edge mode instead of deprecated View flags by @dbebawy in [183072](https://github.com/flutter/flutter/pull/183072) +* Add our own wrapper for `CommonExtension` due to change in signature from 8.x->9.0 by @gmackall in [184433](https://github.com/flutter/flutter/pull/184433) +* Apply rect clipping to surface views by @gmackall in [184471](https://github.com/flutter/flutter/pull/184471) +* Revert "Apply rect clipping to surface views (#184471)" by @gmackall in [184728](https://github.com/flutter/flutter/pull/184728) +* Reland "Apply rect clipping to surface views" by @gmackall in [184732](https://github.com/flutter/flutter/pull/184732) +* Fix Android engine flags defaulting to true for malformed values by @realmeylisdev in [184631](https://github.com/flutter/flutter/pull/184631) +* [CP-beta][Android] Gboard Text Shift Stuck Fix by @flutteractionsbot in [185749](https://github.com/flutter/flutter/pull/185749) + +### Windows + +* [win32] Fix overflow in TaskRunnerWindow. by @knopp in [182822](https://github.com/flutter/flutter/pull/182822) +* Roll GoogleTest to e9907112b472 by @jason-simmons in [182795](https://github.com/flutter/flutter/pull/182795) +* Roll RapidJSON to a branch based on the current upstream head by @jason-simmons in [183048](https://github.com/flutter/flutter/pull/183048) +* Allow stylus support on windows by @CodeDoctorDE in [165323](https://github.com/flutter/flutter/pull/165323) +* fix: show window after first frame callback by @rkishan516 in [183454](https://github.com/flutter/flutter/pull/183454) +* [Windows] Restore and enable IAccessibleEx implementation by @loic-peron-inetum-public in [175406](https://github.com/flutter/flutter/pull/175406) +* Windows: Get graphics adapter from engine instead of view by @knopp in [184479](https://github.com/flutter/flutter/pull/184479) +* [CP-beta][Win32] FlutterDesktopEngineGetGraphicsAdapter should use out parameter by @flutteractionsbot in [185634](https://github.com/flutter/flutter/pull/185634) + +### Linux + +* fix build fail for wayland only platform by @HuQian in [182057](https://github.com/flutter/flutter/pull/182057) +* Remove unused function prototype by @robert-ancell in [182915](https://github.com/flutter/flutter/pull/182915) +* Support sending window constraints in metrics events by @robert-ancell in [182921](https://github.com/flutter/flutter/pull/182921) +* Add fl_view_new_sized_to_content() by @robert-ancell in [182924](https://github.com/flutter/flutter/pull/182924) +* Timeout when waiting for the correct sized frame from Flutter. by @robert-ancell in [182971](https://github.com/flutter/flutter/pull/182971) +* Update fl_texture_gl.h by @nmfisher in [182999](https://github.com/flutter/flutter/pull/182999) +* Add a platform OpenGL context. by @robert-ancell in [183715](https://github.com/flutter/flutter/pull/183715) +* Wrap EGL image usage in a GObject by @robert-ancell in [183539](https://github.com/flutter/flutter/pull/183539) +* Linux reuse sibling by @richardexfo in [183653](https://github.com/flutter/flutter/pull/183653) +* Revert "Linux reuse sibling (#183653)" by @robert-ancell in [183871](https://github.com/flutter/flutter/pull/183871) +* Use clearer return value for idle and timeout callbacks. by @robert-ancell in [183811](https://github.com/flutter/flutter/pull/183811) +* Protect access to renderables with a mutex by @robert-ancell in [183813](https://github.com/flutter/flutter/pull/183813) + +### Web + +* Move all getUniformX tests to web_ui/test. by @walley892 in [180910](https://github.com/flutter/flutter/pull/180910) +* [canvaskit] Fix image decoding in CPU-only mode by @harryterkelsen in [180706](https://github.com/flutter/flutter/pull/180706) +* [web] Fix loading of fragment shader with space in name. by @ksokolovskyi in [180919](https://github.com/flutter/flutter/pull/180919) +* Add support for reduced motion/disable animations on the web by @ditman in [180041](https://github.com/flutter/flutter/pull/180041) +* Skip flaky test on Firefox by @harryterkelsen in [180941](https://github.com/flutter/flutter/pull/180941) +* Fix style manager test by actually focusing the tested element. by @harryterkelsen in [181012](https://github.com/flutter/flutter/pull/181012) +* Reverts "Fix style manager test by actually focusing the tested element. (#181012)" by @auto-submit[bot] in [181060](https://github.com/flutter/flutter/pull/181060) +* Fix bug in multisurfacerenderer where canvases do not have "position: absolute" by @harryterkelsen in [181053](https://github.com/flutter/flutter/pull/181053) +* Add support for fetching array uniforms by name by @walley892 in [180647](https://github.com/flutter/flutter/pull/180647) +* Fix style_manager_test for Firefox by @harryterkelsen in [181084](https://github.com/flutter/flutter/pull/181084) +* Fixing getPositionForOffset by @Rusino in [180913](https://github.com/flutter/flutter/pull/180913) +* Don't pass bounds to saveLayer call when painting ImageFilter by @harryterkelsen in [181353](https://github.com/flutter/flutter/pull/181353) +* [Web] Fix flt-platform-view comment by @loic-sharma in [181576](https://github.com/flutter/flutter/pull/181576) +* fix(web_ui): handle non-invertible matrices in ImageFilter.matrix by @harryterkelsen in [181742](https://github.com/flutter/flutter/pull/181742) +* In the Web codec tests, skip an undecodable image that is used to test a Skia error handling code path. by @jason-simmons in [181870](https://github.com/flutter/flutter/pull/181870) +* perf: web ui loadFontFromList by @caijw in [181440](https://github.com/flutter/flutter/pull/181440) +* Add getUniformMatX support for desktop and mobile by @walley892 in [182117](https://github.com/flutter/flutter/pull/182117) +* Update web ui fragment shader tests by @walley892 in [181877](https://github.com/flutter/flutter/pull/181877) +* engine: Use a super-parameter in one missed case by @srawlins in [181914](https://github.com/flutter/flutter/pull/181914) +* Implement getUniformMatX and getUniformMatXArray functionality on web by @walley892 in [182249](https://github.com/flutter/flutter/pull/182249) +* [web] Stop double loading fonts for WebParagraph by @mdebbar in [182026](https://github.com/flutter/flutter/pull/182026) +* Manual roll Skia from 7bbdc51ab0aa to ce5854495a3a by @jason-simmons in [182637](https://github.com/flutter/flutter/pull/182637) +* fix(web_ui): use static whitelist for image codec tests by @harryterkelsen in [182648](https://github.com/flutter/flutter/pull/182648) +* [web] Run webparagraph tests in CI by @mdebbar in [182092](https://github.com/flutter/flutter/pull/182092) +* [web] Fix failure on Firefox 148 by @mdebbar in [182855](https://github.com/flutter/flutter/pull/182855) +* Paint the paragraph as a single image by @Rusino in [181206](https://github.com/flutter/flutter/pull/181206) +* [web] Roll Firefox to 148 by @mdebbar in [182859](https://github.com/flutter/flutter/pull/182859) +* [web] Fix stack corruption in Skwasm and harden withStackScope API by @harryterkelsen in [182912](https://github.com/flutter/flutter/pull/182912) +* Manual roll Dart SDK to 3.12.0-192.0.dev by @mraleph in [182883](https://github.com/flutter/flutter/pull/182883) +* Fix issue where web embedder is synthesizing key up events too eagerly by @O-Hannonen in [180692](https://github.com/flutter/flutter/pull/180692) +* Fixes future warning for `await`ing `Future` returns in `async` bodies inside `try` blocks by @FMorschel in [182301](https://github.com/flutter/flutter/pull/182301) +* [web] Roll Chrome to 145 by @mdebbar in [182860](https://github.com/flutter/flutter/pull/182860) +* Use isA to test for exceptions by @srujzs in [183129](https://github.com/flutter/flutter/pull/183129) +* Support mixed color spaces in `Color.lerp` by @spydon in [182934](https://github.com/flutter/flutter/pull/182934) +* [web] Use pointer-events: auto for non-interactive leaf semantics nodes by @flutter-zl in [183077](https://github.com/flutter/flutter/pull/183077) +* [web] Updates to the README by @mdebbar in [176292](https://github.com/flutter/flutter/pull/176292) +* [web] Prevent Firefox auto-updates by @mdebbar in [183330](https://github.com/flutter/flutter/pull/183330) +* [web] Fix occasional failure to find Chrome tab by @mdebbar in [183737](https://github.com/flutter/flutter/pull/183737) +* fix(web_ui): move prepareToDraw after raster to improve concurrency and stability by @harryterkelsen in [183791](https://github.com/flutter/flutter/pull/183791) +* fix(web): fix crash in Skwasm when transferring non-transferable texture sources by @harryterkelsen in [183799](https://github.com/flutter/flutter/pull/183799) +* fix(web): handle asynchronously disposed platform views by @harryterkelsen in [183666](https://github.com/flutter/flutter/pull/183666) +* refactor(web): use positive logic and platform defaults for accessibility features by @harryterkelsen in [183907](https://github.com/flutter/flutter/pull/183907) +* web_ui: Remove unused parameters in a few places by @srawlins in [183156](https://github.com/flutter/flutter/pull/183156) +* [web] Make it safe to call dispose multiple times on a CkSurface by @jason-simmons in [184270](https://github.com/flutter/flutter/pull/184270) +* fix(web): call ui.Picture.onDispose for the original picture only by @harryterkelsen in [184348](https://github.com/flutter/flutter/pull/184348) +* [web_ui] Fix avoid_type_to_string lint violation by @srawlins in [184342](https://github.com/flutter/flutter/pull/184342) + +### Tooling + +* [ Widget Preview ] Move widget_preview_scaffold tests to `dev/integration_tests/widget_preview_scaffold` by @bkonyi in [180658](https://github.com/flutter/flutter/pull/180658) +* [web] Don't serve files outside of project by @mdebbar in [180699](https://github.com/flutter/flutter/pull/180699) +* Unpin google_mobile_ads by @goderbauer in [180573](https://github.com/flutter/flutter/pull/180573) +* Reverts "Unpin google_mobile_ads (#180573)" by @auto-submit[bot] in [180761](https://github.com/flutter/flutter/pull/180761) +* [ Tool ] Add support for linux riscv64 architecture by @vhaudiquet in [178711](https://github.com/flutter/flutter/pull/178711) +* fix: there are no riscv fuchsia artifacts by @jtmcdole in [180779](https://github.com/flutter/flutter/pull/180779) +* [ Tool ] Fix `flutter run -d all` crash by @bkonyi in [180845](https://github.com/flutter/flutter/pull/180845) +* Roll pub packages by @flutter-pub-roller-bot in [180900](https://github.com/flutter/flutter/pull/180900) +* [ Tool ] Handle `DartDevelopmentServiceException` when launching web applications by @bkonyi in [180905](https://github.com/flutter/flutter/pull/180905) +* Roll pub packages by @flutter-pub-roller-bot in [180928](https://github.com/flutter/flutter/pull/180928) +* Roll pub packages by @flutter-pub-roller-bot in [180977](https://github.com/flutter/flutter/pull/180977) +* [ Tool ] Ensure `flutter.version.json` is regenerated on upgrade by @bkonyi in [180857](https://github.com/flutter/flutter/pull/180857) +* Roll pub packages by @flutter-pub-roller-bot in [181054](https://github.com/flutter/flutter/pull/181054) +* [ Widget Preview ] Fix crash when `@Preview` annotations appeared outside of `lib/` by @bkonyi in [180768](https://github.com/flutter/flutter/pull/180768) +* Allowlist for dependencies of sdk packages by @sigurdm in [180740](https://github.com/flutter/flutter/pull/180740) +* Add FlutterFramework as an Xcode SwiftPM local package override by @vashworth in [179512](https://github.com/flutter/flutter/pull/179512) +* Fixes macOS App.framework not being codesigned or find framework by @vashworth in [181348](https://github.com/flutter/flutter/pull/181348) +* [ Tool ] Fix `update-packages` failing due to mismatched dependencies between flutter_tools and the framework by @bkonyi in [181335](https://github.com/flutter/flutter/pull/181335) +* Look for project root for FeatureFlags manifest by @Albert221 in [180689](https://github.com/flutter/flutter/pull/180689) +* bump KGP and AGP max known versions by @AbdeMohlbi in [181325](https://github.com/flutter/flutter/pull/181325) +* Replace `pub run` mentions with `dart run` by @sigurdm in [181317](https://github.com/flutter/flutter/pull/181317) +* Fix generating both `settings.gradle` and `settings.gradle.kts` for plugins by @AbdeMohlbi in [181592](https://github.com/flutter/flutter/pull/181592) +* [hooks] Don't run build hooks for code assets in `flutter run` by @dcharkes in [181542](https://github.com/flutter/flutter/pull/181542) +* [flutter_tools] Deprecate `plugin_ffi` template by @dcharkes in [181588](https://github.com/flutter/flutter/pull/181588) +* Remove unused test file by @AbdeMohlbi in [181671](https://github.com/flutter/flutter/pull/181671) +* Roll pub packages by @flutter-pub-roller-bot in [181690](https://github.com/flutter/flutter/pull/181690) +* [native assets] Split debug info into `.dsym` files by @dcharkes in [181533](https://github.com/flutter/flutter/pull/181533) +* [ Tool ] Cleanup `ResidentCompiler` initialization logic by @bkonyi in [181421](https://github.com/flutter/flutter/pull/181421) +* Fix todo about `replacing URL with constants` in `gradle_errors.dart` by @AbdeMohlbi in [181673](https://github.com/flutter/flutter/pull/181673) +* [ Tool ] Don't use `globals.platform` in `getFlutterRoot()` by @bkonyi in [181859](https://github.com/flutter/flutter/pull/181859) +* Remove unused getters on AndroidProject class by @AbdeMohlbi in [181860](https://github.com/flutter/flutter/pull/181860) +* Make `android_plugin_new_output_dir_test` only build release by @gmackall in [181677](https://github.com/flutter/flutter/pull/181677) +* Remove the Flutter.xcframework as a swift dependency by @vashworth in [181739](https://github.com/flutter/flutter/pull/181739) +* Roll pub packages by @flutter-pub-roller-bot in [181871](https://github.com/flutter/flutter/pull/181871) +* Remove `Config complete` log when using `flutter build apk --config-only` by @AbdeMohlbi in [181864](https://github.com/flutter/flutter/pull/181864) +* [flutter_tools] Deprecate web hot reload flag by @nshahan in [181884](https://github.com/flutter/flutter/pull/181884) +* Roll pub packages by @flutter-pub-roller-bot in [181925](https://github.com/flutter/flutter/pull/181925) +* Bump minimum required Xcode version to 15 and recommended to 16 by @okorohelijah in [180531](https://github.com/flutter/flutter/pull/180531) +* Roll pub packages by @flutter-pub-roller-bot in [181965](https://github.com/flutter/flutter/pull/181965) +* Directly generate a Mach-O dynamic library using gen_snapshot. [reland] by @sstrickl in [181539](https://github.com/flutter/flutter/pull/181539) +* Roll pub packages by @flutter-pub-roller-bot in [181973](https://github.com/flutter/flutter/pull/181973) +* `flutter_tool` : Remove redundant enum types inside the enum definition scope by @AbdeMohlbi in [181910](https://github.com/flutter/flutter/pull/181910) +* Add a new flutter cli command, running-apps, using mDNS app discovery by @jwren in [180098](https://github.com/flutter/flutter/pull/180098) +* Remove unused getters in `user_messages.dart` by @AbdeMohlbi in [181867](https://github.com/flutter/flutter/pull/181867) +* Add command to build a Swift Package for Add to App and generate FlutterPluginRegistrant by @vashworth in [181224](https://github.com/flutter/flutter/pull/181224) +* Remove unused constant in `bundle.dart` by @AbdeMohlbi in [182023](https://github.com/flutter/flutter/pull/182023) +* [AGP 9] Added Warning Against Updating to AGP 9 by @jesswrd in [181977](https://github.com/flutter/flutter/pull/181977) +* Fix wrong comment about default impeller value by @AbdeMohlbi in [181831](https://github.com/flutter/flutter/pull/181831) +* [flutter_tools] Cleanup the unused DDC flag by @nshahan in [182177](https://github.com/flutter/flutter/pull/182177) +* [Tool] Remove redundant name fields in an enum by @AbdeMohlbi in [181674](https://github.com/flutter/flutter/pull/181674) +* Fix `flutter build web` ignoring `--web-define` flag by @mkucharski17 in [182079](https://github.com/flutter/flutter/pull/182079) +* [ Tool ] Allow creation of projects inside the engine's examples directory by @jason-simmons in [182268](https://github.com/flutter/flutter/pull/182268) +* Don't throw an exception if no web define variable is set by @EricApostal in [182273](https://github.com/flutter/flutter/pull/182273) +* Add plugin dependencies to Add to App FlutterPluginRegistrant by @vashworth in [182304](https://github.com/flutter/flutter/pull/182304) +* Update iOS/macOS plugin template to add dependency on FlutterFramework by @vashworth in [181416](https://github.com/flutter/flutter/pull/181416) +* refactor: Centralize table formatting logic into a new `formatTable` utility function. by @jwren in [182196](https://github.com/flutter/flutter/pull/182196) +* Filter error messages from `emulator -list-avds` output by @alex-medinsh in [180802](https://github.com/flutter/flutter/pull/180802) +* Remove more getters from userMessages class by @AbdeMohlbi in [182166](https://github.com/flutter/flutter/pull/182166) +* Analyzer, require 10.1.0, fix deprecations in dependency_graph.dart by @scheglov in [182507](https://github.com/flutter/flutter/pull/182507) +* flutter_tools: Copy vendored frameworks from plugin podspecs in ios/macos-framework builds by @MohammedTarigg in [180135](https://github.com/flutter/flutter/pull/180135) +* Update create template to always generate both SwiftPM and CocoaPods support for iOS/macOS plugins by @okorohelijah in [181251](https://github.com/flutter/flutter/pull/181251) +* Roll pub packages by @flutter-pub-roller-bot in [182579](https://github.com/flutter/flutter/pull/182579) +* Manual dart sdk flutter 174bcc79 25ff 4267 8e26 d0e902f18681 1771486449 by @gaaclarke in [182624](https://github.com/flutter/flutter/pull/182624) +* Refactor bin/ shell scripts for better performance and safety by @kevmoo in [182674](https://github.com/flutter/flutter/pull/182674) +* running-apps: update running-apps to use Duration.ago() by @jwren in [182172](https://github.com/flutter/flutter/pull/182172) +* [web] Remove --disable-gpu from flutter chrome tests by @mdebbar in [182618](https://github.com/flutter/flutter/pull/182618) +* Add progress indicator to artifact downloads by @Mr-Pepe in [181808](https://github.com/flutter/flutter/pull/181808) +* Copy Flutter framework to Add to App FlutterPluginRgistrant by @vashworth in [182523](https://github.com/flutter/flutter/pull/182523) +* Move more getters from userMessages class to the appropriate places by @AbdeMohlbi in [182656](https://github.com/flutter/flutter/pull/182656) +* flutter_tools: Use a super-parameter in several missed cases by @srawlins in [182581](https://github.com/flutter/flutter/pull/182581) +* Rename noFrequencyBasedMinification to useFrequencyBasedMinification by @jhonathanqz in [182684](https://github.com/flutter/flutter/pull/182684) +* feat: Add --no-uninstall flag to flutter test for integration tests by @Mastersam07 in [182714](https://github.com/flutter/flutter/pull/182714) +* Add a getter in run.dart to access use-application-binary flag. by @chingjun in [182931](https://github.com/flutter/flutter/pull/182931) +* Add a ResidentCompilerFactory to create ResidentCompiler instances. by @chingjun in [182930](https://github.com/flutter/flutter/pull/182930) +* Linux build hooks: Read compiler config from CMakeCache.txt by @simolus3 in [181004](https://github.com/flutter/flutter/pull/181004) +* When impellerc fails with a long shader compilation error, truncate it and output to a file by @b-luk in [182786](https://github.com/flutter/flutter/pull/182786) +* Enable SwiftPM by default on master and beta by @vashworth in [182923](https://github.com/flutter/flutter/pull/182923) +* Roll pub packages by @flutter-pub-roller-bot in [182640](https://github.com/flutter/flutter/pull/182640) +* Build App and native asset frameworks for Add to App FlutterPluginRegistrant by @vashworth in [183136](https://github.com/flutter/flutter/pull/183136) +* Pass --web-define through to web runner when using --machine mode by @DanTup in [183228](https://github.com/flutter/flutter/pull/183228) +* Give guided message when project is not compatible with SwiftPM by @vashworth in [182394](https://github.com/flutter/flutter/pull/182394) +* Show warning when plugins do not support SwiftPM by @vashworth in [182506](https://github.com/flutter/flutter/pull/182506) +* Make compileShader() retry without sksl if it fails with sksl. by @b-luk in [183146](https://github.com/flutter/flutter/pull/183146) +* Build CocoaPod plugin frameworks for Add to App FlutterPluginRegistrant by @vashworth in [183239](https://github.com/flutter/flutter/pull/183239) +* fix: use double quotes in settings.gradle.kts template by @ishaquehassan in [183081](https://github.com/flutter/flutter/pull/183081) +* Roll pub packages by @flutter-pub-roller-bot in [183319](https://github.com/flutter/flutter/pull/183319) +* Roll pub packages by @flutter-pub-roller-bot in [183344](https://github.com/flutter/flutter/pull/183344) +* [ Tool ] Fix --print-dtd not working for web targets by @bkonyi in [183171](https://github.com/flutter/flutter/pull/183171) +* Roll pub packages by @flutter-pub-roller-bot in [183411](https://github.com/flutter/flutter/pull/183411) +* Roll pub packages by @DanTup in [183527](https://github.com/flutter/flutter/pull/183527) +* Remove redundant VS Code code/tests by @DanTup in [183506](https://github.com/flutter/flutter/pull/183506) +* Fix macOS relative plugin Xcode file path by @vashworth in [183593](https://github.com/flutter/flutter/pull/183593) +* [flutter_tools] Support flavors and transformers for shaders by @Laurie-Lin in [181889](https://github.com/flutter/flutter/pull/181889) +* Update gradle utils to know about kgp 2.3.10 constraints by @reidbaker in [183416](https://github.com/flutter/flutter/pull/183416) +* Properly parse URIs for testPath when the host is running on Windows. by @Eyas in [176881](https://github.com/flutter/flutter/pull/176881) +* Fix Android Studio pluginsPath when version is unknown (do not use 0.0) by @jhonathanqz in [182681](https://github.com/flutter/flutter/pull/182681) +* Throw ToolExit when flutter downgrade receives positional arguments by @NamanGoyalK in [183375](https://github.com/flutter/flutter/pull/183375) +* Prompt plugin authors to add Swift Package Manager compatibility to their plugin by @okorohelijah in [182246](https://github.com/flutter/flutter/pull/182246) +* Add windows instruction to `Forcing Flutter Tools Snapshot Regeneration` by @AbdeMohlbi in [183977](https://github.com/flutter/flutter/pull/183977) +* Add progress bar to artifact downloads by @Mr-Pepe in [182836](https://github.com/flutter/flutter/pull/182836) +* [tools] Make sure `assemble` has a pubspec as cwd by @dcharkes in [184067](https://github.com/flutter/flutter/pull/184067) +* feat: Add --base-href support to flutter run for web by @Mastersam07 in [182709](https://github.com/flutter/flutter/pull/182709) +* Collect impeller analytics for appbundles by @gmackall in [184146](https://github.com/flutter/flutter/pull/184146) +* [ Tool ] Remove `flutter running-apps` command by @bkonyi in [183742](https://github.com/flutter/flutter/pull/183742) +* [ Tool ] Migrate `flutter analyze` to use LSP by @bkonyi in [183785](https://github.com/flutter/flutter/pull/183785) +* Inject FlutterFramework dependency in iOS Add2App swift packages by @vashworth in [184365](https://github.com/flutter/flutter/pull/184365) +* Improve error message when `dart-define` content are not `base64 encoded` and add more test cases by @AbdeMohlbi in [184219](https://github.com/flutter/flutter/pull/184219) +* [ Widget Preview ] Use analysis server for widget preview detection by @bkonyi in [184473](https://github.com/flutter/flutter/pull/184473) +* [data_assets] Cleanup tests by @dcharkes in [184209](https://github.com/flutter/flutter/pull/184209) +* Enable SPM by default on Stable by @okorohelijah in [184495](https://github.com/flutter/flutter/pull/184495) +* [ Widget Preview ] Handle collections and records in custom preview annotations by @bkonyi in [184518](https://github.com/flutter/flutter/pull/184518) +* forward an application name to DDS by @jakemac53 in [184459](https://github.com/flutter/flutter/pull/184459) +* Reverts "[data_assets] Cleanup tests (#184209)" by @auto-submit[bot] in [184575](https://github.com/flutter/flutter/pull/184575) +* Downgrade CocoaPods doctor check to warning and fix build error messaging by @okorohelijah in [184511](https://github.com/flutter/flutter/pull/184511) +* [AGP 9] Add Disable Built-in Kotlin and newDSL Migrators by @jesswrd in [184255](https://github.com/flutter/flutter/pull/184255) +* Parse scheme file with XML parser for SwiftPM migrator by @vashworth in [184525](https://github.com/flutter/flutter/pull/184525) +* `WindowsPlugin` should not crash when ffiPlugin enabled by @Renzo-Olivares in [184695](https://github.com/flutter/flutter/pull/184695) +* Have `flutter create` create a pubspec.lock to ensure pinned versions are being used. by @sigurdm in [175352](https://github.com/flutter/flutter/pull/175352) +* Introduce command to build a swift package for SwiftPM add to app integration by @vashworth in [184660](https://github.com/flutter/flutter/pull/184660) +* Reland "[data_assets] Cleanup tests" by @dcharkes in [184714](https://github.com/flutter/flutter/pull/184714) +* Collect HCPP adoption analytics for flutter run/build apk/build appbundle by @gmackall in [184225](https://github.com/flutter/flutter/pull/184225) +* Tool: Add search and filtering to widget preview scaffold by @NamanGoyalK in [184023](https://github.com/flutter/flutter/pull/184023) +* [cp-beta] Fix codesign verification test for SwiftPM Add to App by @eyebrowsoffire in [185000](https://github.com/flutter/flutter/pull/185000) +* [CP-beta]Use relative path for reloadedSourcesUri and reloaded modules by @flutteractionsbot in [185540](https://github.com/flutter/flutter/pull/185540) +* [CP-beta][Widget Preview] Fix flaky integration test timeout during flutter clean (#184991) by @bkonyi in [185300](https://github.com/flutter/flutter/pull/185300) +* [CP-beta]Fix `--enable-hcpp` flag being ignored in release by @flutteractionsbot in [185717](https://github.com/flutter/flutter/pull/185717) + +### Documentation + +* Update example description by @robert-ancell in [182067](https://github.com/flutter/flutter/pull/182067) + +### Other changes + +* Update flutter changelog for 3.38.6 by @walley892 in [180708](https://github.com/flutter/flutter/pull/180708) +* Update CODEOWNERS to remove chinmaygarde. by @chinmaygarde in [180703](https://github.com/flutter/flutter/pull/180703) +* Enabled some disabled impeller fragment shader dart tests by @gaaclarke in [180759](https://github.com/flutter/flutter/pull/180759) +* Reverts "Enabled some disabled impeller fragment shader dart tests (#180759)" by @auto-submit[bot] in [180785](https://github.com/flutter/flutter/pull/180785) +* Bump ffigen by @goderbauer in [180507](https://github.com/flutter/flutter/pull/180507) +* Fix: Allow dartpad embed clipboard-write permission for "Copy to clipboard" functionality by @dixita0607 in [178057](https://github.com/flutter/flutter/pull/178057) +* Reland `Enabled some disabled impeller fragment shader dart tests` by @gaaclarke in [180788](https://github.com/flutter/flutter/pull/180788) +* Turn on fragment shader equality test by @gaaclarke in [180784](https://github.com/flutter/flutter/pull/180784) +* Roll libpng to version 1.6.53 by @jason-simmons in [180712](https://github.com/flutter/flutter/pull/180712) +* Add build-time checks for ImpellerC's SkSL compiler by @b-luk in [180861](https://github.com/flutter/flutter/pull/180861) +* Adds metal background to engine dart tests by @gaaclarke in [180700](https://github.com/flutter/flutter/pull/180700) +* Reenable 4 fragment shader tests by @gaaclarke in [180875](https://github.com/flutter/flutter/pull/180875) +* In flutter_test_performance, consider the blank line at the start of "flutter test" output to be optional. by @jason-simmons in [180911](https://github.com/flutter/flutter/pull/180911) +* [Impeller] Fix crash trying to check for duplicate vertices in shadow_path code by @flar in [180920](https://github.com/flutter/flutter/pull/180920) +* Made the bad lines exception print out the bad lines by @gaaclarke in [180909](https://github.com/flutter/flutter/pull/180909) +* Fix 'ImageFilter.shader can be applied to canvas operations' test by @b-luk in [180929](https://github.com/flutter/flutter/pull/180929) +* Add missing 'throw' to ImageFilter.shader's validation check by @b-luk in [180923](https://github.com/flutter/flutter/pull/180923) +* Update CHANGELOG at head for 3.38.7 stable hotfix by @walley892 in [180986](https://github.com/flutter/flutter/pull/180986) +* Update discussion of iOS/macOS testing by @stuartmorgan-g in [180898](https://github.com/flutter/flutter/pull/180898) +* Roll pub packages by @flutter-pub-roller-bot in [181006](https://github.com/flutter/flutter/pull/181006) +* Manual roll of Dart SDK from ebaf52c13799 to 8fe983db0c99 (6 revisions) by @jason-simmons in [180978](https://github.com/flutter/flutter/pull/180978) +* Remove setup_hooks.dart and move _setupHooks back into natives.dart by @jason-simmons in [181008](https://github.com/flutter/flutter/pull/181008) +* Add table detailing AI rule file character limits for various tools by @jwren in [179817](https://github.com/flutter/flutter/pull/179817) +* Fix capitalization of the path to FlutterWindowControllerTest.mm in the macOS platform build script by @jason-simmons in [181045](https://github.com/flutter/flutter/pull/181045) +* Reverts "Fix capitalization of the path to FlutterWindowControllerTest.mm in the macOS platform build script (#181045)" by @auto-submit[bot] in [181091](https://github.com/flutter/flutter/pull/181091) +* Migrate gradient creation to the new SkShaders API by @bungeman in [180766](https://github.com/flutter/flutter/pull/180766) +* Remove use of SkDeserialProcs::fTypefaceProc by @bungeman in [181047](https://github.com/flutter/flutter/pull/181047) +* Add route for 'tmp' to Flutter runner by @chaopeng in [181044](https://github.com/flutter/flutter/pull/181044) +* [skia] Use renamed GNI filegroup by @kjlubick in [180853](https://github.com/flutter/flutter/pull/180853) +* [skia] Remove VMA from build logic by @kjlubick in [181183](https://github.com/flutter/flutter/pull/181183) +* Update triage docs by @Piinks in [181193](https://github.com/flutter/flutter/pull/181193) +* Roll pub packages by @flutter-pub-roller-bot in [181226](https://github.com/flutter/flutter/pull/181226) +* Use SkPathBuilder with SkPathMeasure::getSegment by @bungeman in [181205](https://github.com/flutter/flutter/pull/181205) +* Remove bringup flag from Mac_arm64_mokey task by @camsim99 in [178759](https://github.com/flutter/flutter/pull/178759) +* [packages_autoroller] Migrate to `dart build cli` by @dcharkes in [181273](https://github.com/flutter/flutter/pull/181273) +* Marks drive_perf_debug_warning to be unflaky by @jmagman in [181277](https://github.com/flutter/flutter/pull/181277) +* Marks Mac_mokey microbenchmarks to be unflaky by @jmagman in [181276](https://github.com/flutter/flutter/pull/181276) +* Bring Linux coverage out of bringup by @jmagman in [181280](https://github.com/flutter/flutter/pull/181280) +* Enables fragment shader test for impeller (fixes mat2 on vulkan) by @gaaclarke in [181013](https://github.com/flutter/flutter/pull/181013) +* Roll pub packages by @flutter-pub-roller-bot in [181295](https://github.com/flutter/flutter/pull/181295) +* Reland "Fix capitalization of the path to FlutterWindowControllerTest.mm in the macOS platform build script" by @jason-simmons in [181200](https://github.com/flutter/flutter/pull/181200) +* Roll Fuchsia GN SDK from NAEC5tfgSl8g94nwp... to JLBh4Z9PKsjIJcqDU... by @sutes-work in [181139](https://github.com/flutter/flutter/pull/181139) +* [Impeller] Make dynamically created shader metadata for runtime effects consistent with metadata for built-in shaders by @jason-simmons in [181201](https://github.com/flutter/flutter/pull/181201) +* Re-enable fragment_shader_tests.dart 'Shader Compiler appropriately pads vec3 uniform arrays' test on Vulkan by @b-luk in [181292](https://github.com/flutter/flutter/pull/181292) +* Reland hybrid views test by @gmackall in [181336](https://github.com/flutter/flutter/pull/181336) +* No longer exiting the application when the RegularWindow is destroyed + resolving the window created promise after runWidget by @mattkae in [181339](https://github.com/flutter/flutter/pull/181339) +* Adds contents of keys file when a skia gold error occurs. by @gaaclarke in [181401](https://github.com/flutter/flutter/pull/181401) +* [Impeller] Fix interpolation error in Rect::TransformAndClipBounds by @flar in [181420](https://github.com/flutter/flutter/pull/181420) +* [Impeller] Fix perspective clips with a large perspective bias by @flar in [181434](https://github.com/flutter/flutter/pull/181434) +* Fixes metal vec3 uniform padding by @gaaclarke in [181340](https://github.com/flutter/flutter/pull/181340) +* Marks linux_chrome_dev_mode to be unflaky by @jmagman in [181352](https://github.com/flutter/flutter/pull/181352) +* Roll FreeType to 2.14.1 by @jason-simmons in [181428](https://github.com/flutter/flutter/pull/181428) +* Change update_engine_version documenation by @reidbaker in [181508](https://github.com/flutter/flutter/pull/181508) +* Reverts "Fixes metal vec3 uniform padding (#181340)" by @auto-submit[bot] in [181552](https://github.com/flutter/flutter/pull/181552) +* Merge changelog for 3.38.8. by @eyebrowsoffire in [181558](https://github.com/flutter/flutter/pull/181558) +* Marks firebase_release_smoke_test to be unflaky by @jmagman in [181308](https://github.com/flutter/flutter/pull/181308) +* chore: Windows_mokey basic_material_app_win__compile !bringup by @jtmcdole in [180985](https://github.com/flutter/flutter/pull/180985) +* Remove chrome_and_driver dependency where it's not needed by @mdebbar in [178174](https://github.com/flutter/flutter/pull/178174) +* Adds impeller backend to skia gold client by @gaaclarke in [181503](https://github.com/flutter/flutter/pull/181503) +* fix: swap app and engine version in vk::ApplicationInfo by @jtmcdole in [181432](https://github.com/flutter/flutter/pull/181432) +* Fix the issue on macOS where, after a hot restart with multiple windows, unresponsive windows are left behind. by @yiiim in [180287](https://github.com/flutter/flutter/pull/180287) +* Account for vec3 padding in Metal by @walley892 in [181563](https://github.com/flutter/flutter/pull/181563) +* Fixes getUniformX for Vulkan by @walley892 in [181286](https://github.com/flutter/flutter/pull/181286) +* Merge changelog for 3.38.9 by @eyebrowsoffire in [181668](https://github.com/flutter/flutter/pull/181668) +* [Impeller] Fix off-by-one indices in the SimilarPointPair/SimilarPointTrio functions used by ShadowPathGeometryTest by @jason-simmons in [181623](https://github.com/flutter/flutter/pull/181623) +* Roll libpng to version 1.6.54 by @jason-simmons in [181625](https://github.com/flutter/flutter/pull/181625) +* Remove nonstandard ndkpath for `hybrid_android_views` integration test by @gmackall in [181666](https://github.com/flutter/flutter/pull/181666) +* [Impeller] Ensure that HostBuffers/DeviceBuffers allocated by RendererTest tests are valid for the lifetime of the RenderPass by @jason-simmons in [181635](https://github.com/flutter/flutter/pull/181635) +* Add `android_sdk` dependency to `android_engine_opengles_tests` by @gmackall in [181681](https://github.com/flutter/flutter/pull/181681) +* Extend the Windows tool_integration_tests_2_9 shard timeout to 1 hour by @jason-simmons in [181678](https://github.com/flutter/flutter/pull/181678) +* Make the Windows windowing_test in .ci.yaml have bringup as false by @mattkae in [181664](https://github.com/flutter/flutter/pull/181664) +* enable enhanced debugging for GLES playground by @planetmarshall in [181157](https://github.com/flutter/flutter/pull/181157) +* add stacktrace support when requested for host builds by @planetmarshall in [181264](https://github.com/flutter/flutter/pull/181264) +* update GLFW to latest and use EGL context creation on linux by @planetmarshall in [181259](https://github.com/flutter/flutter/pull/181259) +* add ccache support for custom toolchain by @planetmarshall in [180737](https://github.com/flutter/flutter/pull/180737) +* chore: deflake Linux_mokey flutter_engine_group_performance by @jtmcdole in [181624](https://github.com/flutter/flutter/pull/181624) +* Update New Android API Docs by @jesswrd in [180604](https://github.com/flutter/flutter/pull/180604) +* [Impeller] Fix type conversion warnings seen on Windows when Impeller GL API wrappers log arguments with function types by @jason-simmons in [181734](https://github.com/flutter/flutter/pull/181734) +* Roll pub packages by @flutter-pub-roller-bot in [181738](https://github.com/flutter/flutter/pull/181738) +* [ Tool ] Fix regression introduced in flutter/flutter#181421 by @bkonyi in [181826](https://github.com/flutter/flutter/pull/181826) +* Adds batch release doc for flutter/package by @chunhtai in [181676](https://github.com/flutter/flutter/pull/181676) +* Add Linux Foundation Health Score badge to README by @jonathimer in [175587](https://github.com/flutter/flutter/pull/175587) +* Roll customer tests by @loic-sharma in [181825](https://github.com/flutter/flutter/pull/181825) +* Unmark `hybrid_android_views_integration_test` as bringup by @gmackall in [181628](https://github.com/flutter/flutter/pull/181628) +* Organize and update fragment shader uniform tests. by @walley892 in [181822](https://github.com/flutter/flutter/pull/181822) +* [Impeller] Fix flattening of very large zoomed curves with tiny stroke widths by @flar in [181505](https://github.com/flutter/flutter/pull/181505) +* Marks platform_views_scroll_perf_impeller__timeline_summary unflaky by @jmagman in [181649](https://github.com/flutter/flutter/pull/181649) +* Re-enable AddressSanitizer on the linux_unopt builder by @jason-simmons in [181741](https://github.com/flutter/flutter/pull/181741) +* Temporarily remove the Pixel 9/API 36 device from the Firebase Test Lab tests. by @jason-simmons in [181956](https://github.com/flutter/flutter/pull/181956) +* Update Dart SDK to 3.12 beta1 by @iinozemtsev in [181948](https://github.com/flutter/flutter/pull/181948) +* Manual roll Skia from 39aa2a70213a to 9a983f6c2c06 by @jason-simmons in [181986](https://github.com/flutter/flutter/pull/181986) +* Add buffer around rerasterized input to fragment shaders to maintain coordinate space when clipped by @gaaclarke in [181743](https://github.com/flutter/flutter/pull/181743) +* Adds opengles to engine dart tests by @b-luk in [181933](https://github.com/flutter/flutter/pull/181933) +* Updated Shaderc dep by @gaaclarke in [180976](https://github.com/flutter/flutter/pull/180976) +* Add missing dependencies to framework_tests_misc_leak_tracking by @dkwingsmt in [181929](https://github.com/flutter/flutter/pull/181929) +* Delete the last remaining skia only fragment shader tests by @gaaclarke in [182127](https://github.com/flutter/flutter/pull/182127) +* [gn] fix --stripped being disabled for all targets by @martinetd in [181984](https://github.com/flutter/flutter/pull/181984) +* Roll pub packages by @flutter-pub-roller-bot in [182120](https://github.com/flutter/flutter/pull/182120) +* Update linux_unopt CI: Increase timeout and remove --quiet flag by @b-luk in [182162](https://github.com/flutter/flutter/pull/182162) +* Roll ANGLE to ad5b0084fe6b by @jason-simmons in [182183](https://github.com/flutter/flutter/pull/182183) +* [Impeller] Fix VkImageView leak in WrappedTextureSourceVK by @RickyvdBerg in [181966](https://github.com/flutter/flutter/pull/181966) +* Fix incorrect rendering from drawImageNine when running on impeller with opengles by @b-luk in [182179](https://github.com/flutter/flutter/pull/182179) +* Update `CHANGELOG` to include 3.41 stable release by @camsim99 in [182227](https://github.com/flutter/flutter/pull/182227) +* Changelog entry for 3.38.10 stable hotfix by @justinmc in [182237](https://github.com/flutter/flutter/pull/182237) +* Increase timeout for tracing_test.dart's "Canvas.saveLayer emits tracing" by @b-luk in [182225](https://github.com/flutter/flutter/pull/182225) +* Made sure no test() declaration happens asynchronously in fragment shader tests by @gaaclarke in [182306](https://github.com/flutter/flutter/pull/182306) +* [Impeller] Dispose thread local caches on each frame when using GPUSurfaceVulkanImpeller with a delegate by @jason-simmons in [182265](https://github.com/flutter/flutter/pull/182265) +* Update `CHANGELOG` for 3.41.1 release by @camsim99 in [182393](https://github.com/flutter/flutter/pull/182393) +* Turns on most of fragment_shader_test.dart for opengles by @gaaclarke in [182229](https://github.com/flutter/flutter/pull/182229) +* Adds impeller backend to golden workspace name by @gaaclarke in [182387](https://github.com/flutter/flutter/pull/182387) +* Disable multithread opengles, enables remaining fragment shader tests by @gaaclarke in [182384](https://github.com/flutter/flutter/pull/182384) +* Fix iOS CI tests for Xcode 26 Swift compatibility by @okorohelijah in [182132](https://github.com/flutter/flutter/pull/182132) +* Unmark stable vulkan platform view tests as bringup by @gmackall in [182554](https://github.com/flutter/flutter/pull/182554) +* Update android symbolication instructions by @gmackall in [181267](https://github.com/flutter/flutter/pull/181267) +* Bring Windows misc coverage out of bringup by @dkwingsmt in [182332](https://github.com/flutter/flutter/pull/182332) +* Marks Mac_arm64_mokey entrypoint_dart_registrant unflaky by @jmagman in [181648](https://github.com/flutter/flutter/pull/181648) +* [pv]add integration test for original untappable web view link behind context menu bug by @hellohuanlin in [182111](https://github.com/flutter/flutter/pull/182111) +* Update CHANGELOG for 3.41.2 stable hotfix by @LongCatIsLooong in [182647](https://github.com/flutter/flutter/pull/182647) +* [Impeller] libImpeller: Dispose thread local caches on each Vulkan frame by @jason-simmons in [182402](https://github.com/flutter/flutter/pull/182402) +* Don't compile shaders to SkSL unless --sksl arg is present by @b-luk in [182519](https://github.com/flutter/flutter/pull/182519) +* Clarify batch release mode requirements by @chunhtai in [182228](https://github.com/flutter/flutter/pull/182228) +* Update roadmap for 2026 by @twerske in [182798](https://github.com/flutter/flutter/pull/182798) +* Refactor impellerc_main to better organize some of its logic by @b-luk in [182783](https://github.com/flutter/flutter/pull/182783) +* Replace more references to `flutter/engine` with `flutter/flutter` by @AbdeMohlbi in [182654](https://github.com/flutter/flutter/pull/182654) +* Fix a race in EmbedderTest.CanSpecifyCustomUITaskRunner by @jason-simmons in [182649](https://github.com/flutter/flutter/pull/182649) +* [Impeller] Fix fail to render pixel buffer texture on Linux by @xiaowei-guan in [181656](https://github.com/flutter/flutter/pull/181656) +* docs(Path): clarify that zero-length contours are excluded from computeMetrics by @nathannewyen in [180165](https://github.com/flutter/flutter/pull/180165) +* Rename "dart-pkg" to "dart_pkg" in the Fuchsia Flutter Engine by @mbrase in [182574](https://github.com/flutter/flutter/pull/182574) +* Call dart::bin::Platform::Initialize during Dart VM startup by @jason-simmons in [182689](https://github.com/flutter/flutter/pull/182689) +* Update package contrib docs for batched release by @stuartmorgan-g in [182865](https://github.com/flutter/flutter/pull/182865) +* Roll ImGui to v1.92.6-docking by @jason-simmons in [182799](https://github.com/flutter/flutter/pull/182799) +* Fix typos in method names across multiple files by @itsAdityaRathore in [182584](https://github.com/flutter/flutter/pull/182584) +* Add calls to await `flutterDriver.waitUntilFirstFrameRasterized()` for all `android_engine_test` screenshot tests by @gmackall in [182961](https://github.com/flutter/flutter/pull/182961) +* [ CI ] Don't crash analysis when ktlint isn't on PATH by @bkonyi in [181854](https://github.com/flutter/flutter/pull/181854) +* Roll zlib to 7eda07b1e067 by @jason-simmons in [182692](https://github.com/flutter/flutter/pull/182692) +* chore: Don't unconditionally check tools/gn formatting by @harryterkelsen in [182973](https://github.com/flutter/flutter/pull/182973) +* licenses_cpp: pre-land changes for perfetto update by @gaaclarke in [182965](https://github.com/flutter/flutter/pull/182965) +* Ignore unawaited_futures lint in dev/automated_tests by @victorsanni in [182922](https://github.com/flutter/flutter/pull/182922) +* Adds float32 output to `Image.toByteData()` in float32 Image by @gaaclarke in [182847](https://github.com/flutter/flutter/pull/182847) +* [Impeller] For Android hardware buffers on Vulkan, use an alpha value of 1 if the buffer format always has opaque alpha by @jason-simmons in [182974](https://github.com/flutter/flutter/pull/182974) +* Add information to issue triage page by @stuartmorgan-g in [182145](https://github.com/flutter/flutter/pull/182145) +* [rules] Fix a few issues in the full-length rules file by @parlough in [182725](https://github.com/flutter/flutter/pull/182725) +* Merge changelog from 3.41.3. by @eyebrowsoffire in [183131](https://github.com/flutter/flutter/pull/183131) +* [workflow] Update the changelog merge action to fetch the stable branch by @itsjustkevin in [183132](https://github.com/flutter/flutter/pull/183132) +* fix: bump matcher by @jtmcdole in [183167](https://github.com/flutter/flutter/pull/183167) +* [ios]uitest for admob banner in scrollable list gesture issue by @hellohuanlin in [183128](https://github.com/flutter/flutter/pull/183128) +* Add dev/benchmarks/README.md by @loic-sharma in [182976](https://github.com/flutter/flutter/pull/182976) +* Use dart::bin::SetupDartIo to setup dart:io by @mraleph in [176714](https://github.com/flutter/flutter/pull/176714) +* Fix docs on SingletonFlutterWindow.supportsShowingSystemContextMenu by @loic-sharma in [183142](https://github.com/flutter/flutter/pull/183142) +* Merge changelog from 3.41.4 stable. by @eyebrowsoffire in [183243](https://github.com/flutter/flutter/pull/183243) +* Add Michal Kucharski to AUTHORS by @mkucharski17 in [182366](https://github.com/flutter/flutter/pull/182366) +* chore: convert android_verified_input to pub-workspace by @jtmcdole in [183175](https://github.com/flutter/flutter/pull/183175) +* Replace the rest of the references to `flutter/engine` with `flutter/flutter` by @AbdeMohlbi in [182938](https://github.com/flutter/flutter/pull/182938) +* Update Dart to 3.12 beta 2 by @liamappelbe in [183251](https://github.com/flutter/flutter/pull/183251) +* Extend the Linux web_skwasm_tests_1 timeout to 45 minutes by @jason-simmons in [183247](https://github.com/flutter/flutter/pull/183247) +* Simplify TesterContextGLES (multithreading logic not needed), and enable some tests that now pass by @b-luk in [183250](https://github.com/flutter/flutter/pull/183250) +* Roll pub packages by @flutter-pub-roller-bot in [183178](https://github.com/flutter/flutter/pull/183178) +* [Impeller] Fix new convex path shadow generation in perspective by @flar in [183187](https://github.com/flutter/flutter/pull/183187) +* Add GitHub workflows to assist with release tasks by @eyebrowsoffire in [181978](https://github.com/flutter/flutter/pull/181978) +* Fix typo in README by @mboetger in [183245](https://github.com/flutter/flutter/pull/183245) +* Add back in accidentally removed line from `create_updated_flutter_deps.py` by @eyebrowsoffire in [183314](https://github.com/flutter/flutter/pull/183314) +* [Impeller] Do not wait for a frame's acquire fence if the frame was never presented by @jason-simmons in [183288](https://github.com/flutter/flutter/pull/183288) +* [doc]add discord channel to ios triage meeting by @hellohuanlin in [183285](https://github.com/flutter/flutter/pull/183285) +* Support BGRA textures in BlitCopyTextureToBufferCommandGLES::Encode and fix improper mapping of BGRA to RGBA in blit_command_gles and texture_gles by @b-luk in [182397](https://github.com/flutter/flutter/pull/182397) +* Updates tests commit by @FMorschel in [183301](https://github.com/flutter/flutter/pull/183301) +* Cleanup MockVulkan when the vulkan instance is destroyed by @gaaclarke in [183324](https://github.com/flutter/flutter/pull/183324) +* Add a note to `arcTo` docs about the 2PI drawing angle issue by @AbdeMohlbi in [183293](https://github.com/flutter/flutter/pull/183293) +* Standardize skia includes. by @chingjun in [183404](https://github.com/flutter/flutter/pull/183404) +* Update org triage by @Piinks in [183254](https://github.com/flutter/flutter/pull/183254) +* Add Alexander Dmitriev to AUTHORS by @BrainLUX in [183357](https://github.com/flutter/flutter/pull/183357) +* Update 'a: text input' globs by @loic-sharma in [183405](https://github.com/flutter/flutter/pull/183405) +* Migrated circle sdf to euclidean 2d derivative by @gaaclarke in [183184](https://github.com/flutter/flutter/pull/183184) +* DlDeferredImageGPUImpeller::ImageWrapper texture thread safety improvements by @jason-simmons in [183429](https://github.com/flutter/flutter/pull/183429) +* [Impeller] Do not log VK_ERROR_SURFACE_LOST_KHR errors returned by vkAcquireNextImageKHR by @jason-simmons in [183338](https://github.com/flutter/flutter/pull/183338) +* dev: Use a super-parameter in several missed cases by @srawlins in [182251](https://github.com/flutter/flutter/pull/182251) +* Roll pub packages by @flutter-pub-roller-bot in [183467](https://github.com/flutter/flutter/pull/183467) +* Fix GitHub workflows to use the `flutteractionsbot` mirror for PR branches. by @eyebrowsoffire in [183470](https://github.com/flutter/flutter/pull/183470) +* Add GLES support for the same pixel formats for copying texture -> buffer as when copying buffer -> texture by @b-luk in [183428](https://github.com/flutter/flutter/pull/183428) +* [impeller] Use the GLES3 shaders in the embedder if supported by @planetmarshall in [180072](https://github.com/flutter/flutter/pull/180072) +* Rename ExecutionModelToString to ExecutionModelToStringName. by @chingjun in [183461](https://github.com/flutter/flutter/pull/183461) +* ci: Run orchestrator for windows_arm_host_engine on Linux by @Gustl22 in [181075](https://github.com/flutter/flutter/pull/181075) +* Use CLA-approved email and username for github workflow commits. by @eyebrowsoffire in [183540](https://github.com/flutter/flutter/pull/183540) +* Re-enable gpu_test.dart for opengles, but disable specific tests in the file by @b-luk in [183531](https://github.com/flutter/flutter/pull/183531) +* Roll pub packages by @flutter-pub-roller-bot in [183541](https://github.com/flutter/flutter/pull/183541) +* Made cp labels get rejected on issues. by @gaaclarke in [183595](https://github.com/flutter/flutter/pull/183595) +* [web] Fix Web SDK build on macOS by @harryterkelsen in [183549](https://github.com/flutter/flutter/pull/183549) +* Specified the repo the cp label will be removed from by @gaaclarke in [183611](https://github.com/flutter/flutter/pull/183611) +* Use operator<=> instead of std::less for UniqueID. by @chingjun in [183600](https://github.com/flutter/flutter/pull/183600) +* ci: Remove `bringup` from orchestrator for windows_arm_host_engine on Linux by @Gustl22 in [183574](https://github.com/flutter/flutter/pull/183574) +* Update android integration test to match the current android semantics by @chunhtai in [183548](https://github.com/flutter/flutter/pull/183548) +* Adds complex layout impeller startup benchmark by @gaaclarke in [183655](https://github.com/flutter/flutter/pull/183655) +* Add some quality of life improvements to the release GitHub workflows. by @eyebrowsoffire in [183658](https://github.com/flutter/flutter/pull/183658) +* Use properties to configure leak_tracking and test_randomization_off in .ci.yaml by @jason-simmons in [183605](https://github.com/flutter/flutter/pull/183605) +* Adds github action to reset cicd when new branches come by @gaaclarke in [183675](https://github.com/flutter/flutter/pull/183675) +* Filter 'waiting for customer response' issues from macOS triage by @loic-sharma in [183552](https://github.com/flutter/flutter/pull/183552) +* docs: add code review guidance to CONTRIBUTING.md by @lamek in [182778](https://github.com/flutter/flutter/pull/182778) +* Fix formatting, capitalization, and grammar in activation issue template by @sanketudaypatil in [183061](https://github.com/flutter/flutter/pull/183061) +* Adds flush to metal screenshotter. by @gaaclarke in [183758](https://github.com/flutter/flutter/pull/183758) +* Adds platform_view_test_macos_impeller by @gaaclarke in [183760](https://github.com/flutter/flutter/pull/183760) +* Update goldctl version by @mdebbar in [183538](https://github.com/flutter/flutter/pull/183538) +* [build] Generate debug info for assembly. by @rmacnak-google in [183425](https://github.com/flutter/flutter/pull/183425) +* Adds macos impeller new gallery transition perf test. by @gaaclarke in [183802](https://github.com/flutter/flutter/pull/183802) +* Update android triage process to not look at unassigned p1s every week by @gmackall in [183805](https://github.com/flutter/flutter/pull/183805) +* Encode source file patches as UTF-8 in the code formatter script by @jason-simmons in [183761](https://github.com/flutter/flutter/pull/183761) +* [Impeller] Do not delete the GL object in a HandleGLES if the handle has a cleanup callback by @jason-simmons in [183561](https://github.com/flutter/flutter/pull/183561) +* Update CHANGELOG for Flutter 3.41.5 release by @camsim99 in [183851](https://github.com/flutter/flutter/pull/183851) +* Roll pub packages by @flutter-pub-roller-bot in [183781](https://github.com/flutter/flutter/pull/183781) +* [wimp] MSAA support by @eyebrowsoffire in [183807](https://github.com/flutter/flutter/pull/183807) +* updates logic for determining if cicd label is outdated by @gaaclarke in [183905](https://github.com/flutter/flutter/pull/183905) +* Add some extra slack room for stroked and filled circles that use the SDF shader by @walley892 in [183536](https://github.com/flutter/flutter/pull/183536) +* Add note about gclient sync network failures and workaround by @ashoknarayan in [183794](https://github.com/flutter/flutter/pull/183794) +* chore: deflake Linux_android_emu android_display_cutout by @jtmcdole in [183522](https://github.com/flutter/flutter/pull/183522) +* Keep glyphs for variable fonts by @gmackall in [183857](https://github.com/flutter/flutter/pull/183857) +* fix gaussian blur getting clipped with negative scale by @walley892 in [184037](https://github.com/flutter/flutter/pull/184037) +* Add LeanCode and contributors to AUTHORS by @mkucharski17 in [182997](https://github.com/flutter/flutter/pull/182997) +* Refactor: Removes Geometry field from ColorSourceContents by @gaaclarke in [183952](https://github.com/flutter/flutter/pull/183952) +* Roll Dart DevTools to a version with correct CIPD tags by @jason-simmons in [184172](https://github.com/flutter/flutter/pull/184172) +* Adds explicit name to the cicd label job. by @gaaclarke in [184070](https://github.com/flutter/flutter/pull/184070) +* Add notes on HCPP to `Android-Platform-Views.md` by @gmackall in [183859](https://github.com/flutter/flutter/pull/183859) +* Fix merge changelog workflow. by @eyebrowsoffire in [184145](https://github.com/flutter/flutter/pull/184145) +* Expand simple shape path optimization logic and move it from dl_dispatcher to dl_builder by @b-luk in [184096](https://github.com/flutter/flutter/pull/184096) +* Revert "Keep glyphs for variable fonts (#183857)" by @jason-simmons in [184147](https://github.com/flutter/flutter/pull/184147) +* fix: use atomic write for engine.stamp to prevent race conditions by @b055man in [184131](https://github.com/flutter/flutter/pull/184131) +* [ios]add ci/cd label to ios triage by @hellohuanlin in [184214](https://github.com/flutter/flutter/pull/184214) +* Update changelog for 3.41.6 stable hotfix by @walley892 in [184220](https://github.com/flutter/flutter/pull/184220) +* Update iOS/macOS flutter_tools CODEOWNERS by @jmagman in [183287](https://github.com/flutter/flutter/pull/183287) +* Build engine for windows_arm on beta and stable by @Gustl22 in [176385](https://github.com/flutter/flutter/pull/176385) +* Add foundation for uber SDF shader and Contents by @gaaclarke in [183864](https://github.com/flutter/flutter/pull/183864) +* [Flutter GPU] Improve context initialization error messages by @bdero in [183986](https://github.com/flutter/flutter/pull/183986) +* [a11y] fix selected tristate flags mismatch by @hannah-hyj in [184223](https://github.com/flutter/flutter/pull/184223) +* Enables sdf lines for metalsdf by @gaaclarke in [183809](https://github.com/flutter/flutter/pull/183809) +* Add drawPath documentation about preferring other methods for drawing simple shapes by @b-luk in [184253](https://github.com/flutter/flutter/pull/184253) +* Roll HarfBuzz to 13.2.1 by @jason-simmons in [184210](https://github.com/flutter/flutter/pull/184210) +* Bump codecov/codecov-action from 5.5.0 to 6.0.0 in the all-github-actions group by @dependabot[bot] in [184364](https://github.com/flutter/flutter/pull/184364) +* Roll pub packages by @flutter-pub-roller-bot in [184045](https://github.com/flutter/flutter/pull/184045) +* Rick roll triagers on/near April 1st by @justinmc in [184355](https://github.com/flutter/flutter/pull/184355) +* Remove an obsolete script for setting up remote GDB sessions on Android devices by @jason-simmons in [184357](https://github.com/flutter/flutter/pull/184357) +* Fixes a flake in reload shaders tests by @gaaclarke in [184268](https://github.com/flutter/flutter/pull/184268) +* Remove the cupertino_icons dependency from the spell_check integration test by @jason-simmons in [184398](https://github.com/flutter/flutter/pull/184398) +* Remove the default_git_folder GN argument by @jason-simmons in [184152](https://github.com/flutter/flutter/pull/184152) +* [Impeller] Do not log an error when wrapping an empty texture as a TextureGLES by @jason-simmons in [184377](https://github.com/flutter/flutter/pull/184377) +* Adds uber sdf shader gradients with blend by @gaaclarke in [184090](https://github.com/flutter/flutter/pull/184090) +* Prepare for skills adoption by @reidbaker in [184129](https://github.com/flutter/flutter/pull/184129) +* [fix-forward] fix build_android_host_app_with_module_source integration test by @jesswrd in [184466](https://github.com/flutter/flutter/pull/184466) +* Moves android_semantics_integration_test out of staging by @chunhtai in [184079](https://github.com/flutter/flutter/pull/184079) +* Support different joins for stroked rects in uber_sdf, fix incorrect aa by @b-luk in [184395](https://github.com/flutter/flutter/pull/184395) +* Fix wide gamut macos integration test by @walley892 in [184427](https://github.com/flutter/flutter/pull/184427) +* Reverts "Roll ICU from ee5f27adc28b to ff7995a708a1 (5 revisions) (#184566)" by @auto-submit[bot] in [184586](https://github.com/flutter/flutter/pull/184586) +* Skill to find dart or flutter revision from a hash by @reidbaker in [184589](https://github.com/flutter/flutter/pull/184589) +* Add suggestion for what types of skills are helpful by @reidbaker in [184661](https://github.com/flutter/flutter/pull/184661) +* Fix go/ links in rbe.mde by @b-luk in [184672](https://github.com/flutter/flutter/pull/184672) +* [Fix-forward] Added Compose plugin to Add-to-app Integration Test by @jesswrd in [184681](https://github.com/flutter/flutter/pull/184681) +* Add a github workflow for reverting PRs. by @eyebrowsoffire in [184593](https://github.com/flutter/flutter/pull/184593) +* Remove bringup label for resharded Windows tool_integration_tests shards by @bkonyi in [184721](https://github.com/flutter/flutter/pull/184721) +* [ci] mac build_test bringup false by @dcharkes in [184738](https://github.com/flutter/flutter/pull/184738) +* Replace hard coded max path length with system defined one. by @robert-ancell in [184697](https://github.com/flutter/flutter/pull/184697) +* Remove custom `analysis_options.yaml` from `imitation_game_flutter` by @goderbauer in [184717](https://github.com/flutter/flutter/pull/184717) +* Try one more again by @Piinks in [184767](https://github.com/flutter/flutter/pull/184767) +* Allow personal skills to be gitignored by @vashworth in [184727](https://github.com/flutter/flutter/pull/184727) +* [ci] mac_arm64 build_test re-enable shard 1 presubmit by @dcharkes in [184751](https://github.com/flutter/flutter/pull/184751) +* Fix repo check on code freeze by @Piinks in [184771](https://github.com/flutter/flutter/pull/184771) +* Roll pub packages by @flutter-pub-roller-bot in [184772](https://github.com/flutter/flutter/pull/184772) +* Correctly handle failure to read /proc/self/exe link by @robert-ancell in [184700](https://github.com/flutter/flutter/pull/184700) +* [fuchsia] Give AOT runners the ability to copy FFI callback thunks. by @rmacnak-google in [184696](https://github.com/flutter/flutter/pull/184696) +* Update to the beta dart version for 3.44 branch cut. by @reidbaker in [184770](https://github.com/flutter/flutter/pull/184770) +* Change freeze flow to pull_request_target by @Piinks in [184785](https://github.com/flutter/flutter/pull/184785) +* 3 44 inital beta bump engine version by @reidbaker in [184883](https://github.com/flutter/flutter/pull/184883) +* [CP-beta]Disable multi-pack-index when calling flutter from Xcode by @flutteractionsbot in [185100](https://github.com/flutter/flutter/pull/185100) +* [flutter-3.44-candidate.0] Update Flutter DEPS to Dart 963eac24852a989a1244586fea61b173e98677dd by @flutteractionsbot in [185114](https://github.com/flutter/flutter/pull/185114) +* [CP-beta]Don't use `git add -N` in the sync engine workflow. by @flutteractionsbot in [185130](https://github.com/flutter/flutter/pull/185130) +* [flutter-3.44-candidate.0] Sync engine.version to 86ee39d2595de3a2a2cee84372bf925d774d3a6f by @flutteractionsbot in [185135](https://github.com/flutter/flutter/pull/185135) +* [CP-beta]Check for overflow when computing the pixel buffer size for an animated PNG frame by @flutteractionsbot in [185620](https://github.com/flutter/flutter/pull/185620) +* [CP-beta]Fix sdfs being enabled for MacOS regardless of FLTEnableSDFs value by @flutteractionsbot in [185680](https://github.com/flutter/flutter/pull/185680) +* [flutter-3.44-candidate.0] Update Flutter DEPS to Dart 9dc12969f5526d1bf1c2b48197d1608a68075866 by @flutteractionsbot in [185757](https://github.com/flutter/flutter/pull/185757) +* [flutter-3.44-candidate.0] Sync engine.version to 73dc1ccd62aec198da4aefde1dae20b1167b131d by @flutteractionsbot in [185771](https://github.com/flutter/flutter/pull/185771) + +## New contributors + +* @Koichi5 made their first contribution in [180172](https://github.com/flutter/flutter/pull/180172) +* @vhaudiquet made their first contribution in [178711](https://github.com/flutter/flutter/pull/178711) +* @augustocesarperin made their first contribution in [180824](https://github.com/flutter/flutter/pull/180824) +* @jonmountjoy made their first contribution in [178643](https://github.com/flutter/flutter/pull/178643) +* @ikramhasan made their first contribution in [181050](https://github.com/flutter/flutter/pull/181050) +* @chaopeng made their first contribution in [181044](https://github.com/flutter/flutter/pull/181044) +* @aaazlkm made their first contribution in [180100](https://github.com/flutter/flutter/pull/180100) +* @Enderjua made their first contribution in [181041](https://github.com/flutter/flutter/pull/181041) +* @Lilian-C made their first contribution in [180577](https://github.com/flutter/flutter/pull/180577) +* @IvoneDjaja made their first contribution in [177895](https://github.com/flutter/flutter/pull/177895) +* @chris-prenissl made their first contribution in [181082](https://github.com/flutter/flutter/pull/181082) +* @Turskyi made their first contribution in [181475](https://github.com/flutter/flutter/pull/181475) +* @AnishTiwari5077 made their first contribution in [180367](https://github.com/flutter/flutter/pull/180367) +* @westito made their first contribution in [181720](https://github.com/flutter/flutter/pull/181720) +* @jonathimer made their first contribution in [175587](https://github.com/flutter/flutter/pull/175587) +* @Erengun made their first contribution in [181657](https://github.com/flutter/flutter/pull/181657) +* @patrickBillingsley made their first contribution in [181579](https://github.com/flutter/flutter/pull/181579) +* @yeltayev22 made their first contribution in [181807](https://github.com/flutter/flutter/pull/181807) +* @GiancarloCante made their first contribution in [180944](https://github.com/flutter/flutter/pull/180944) +* @ashoknarayan made their first contribution in [180469](https://github.com/flutter/flutter/pull/180469) +* @caijw made their first contribution in [181440](https://github.com/flutter/flutter/pull/181440) +* @HuQian made their first contribution in [182057](https://github.com/flutter/flutter/pull/182057) +* @crackedhandle made their first contribution in [182051](https://github.com/flutter/flutter/pull/182051) +* @martinetd made their first contribution in [181984](https://github.com/flutter/flutter/pull/181984) +* @LailaiMaster made their first contribution in [180386](https://github.com/flutter/flutter/pull/180386) +* @RickyvdBerg made their first contribution in [181966](https://github.com/flutter/flutter/pull/181966) +* @safwanidrees made their first contribution in [180257](https://github.com/flutter/flutter/pull/180257) +* @mkucharski17 made their first contribution in [182079](https://github.com/flutter/flutter/pull/182079) +* @EricApostal made their first contribution in [182273](https://github.com/flutter/flutter/pull/182273) +* @gbolahan507 made their first contribution in [182211](https://github.com/flutter/flutter/pull/182211) +* @ilyosbek22 made their first contribution in [181721](https://github.com/flutter/flutter/pull/181721) +* @devnoaman made their first contribution in [180814](https://github.com/flutter/flutter/pull/180814) +* @akhil-ge0rge made their first contribution in [181658](https://github.com/flutter/flutter/pull/181658) +* @Akshat-Shuklaaa made their first contribution in [182461](https://github.com/flutter/flutter/pull/182461) +* @Valansch made their first contribution in [181716](https://github.com/flutter/flutter/pull/181716) +* @twerske made their first contribution in [182798](https://github.com/flutter/flutter/pull/182798) +* @xiaowei-guan made their first contribution in [181656](https://github.com/flutter/flutter/pull/181656) +* @jhonathanqz made their first contribution in [182684](https://github.com/flutter/flutter/pull/182684) +* @serbandin made their first contribution in [181931](https://github.com/flutter/flutter/pull/181931) +* @iamvikashtiwari made their first contribution in [181238](https://github.com/flutter/flutter/pull/181238) +* @BrainLUX made their first contribution in [182093](https://github.com/flutter/flutter/pull/182093) +* @mbcorona made their first contribution in [182785](https://github.com/flutter/flutter/pull/182785) +* @itsAdityaRathore made their first contribution in [182584](https://github.com/flutter/flutter/pull/182584) +* @sero583 made their first contribution in [182224](https://github.com/flutter/flutter/pull/182224) +* @eMxPi made their first contribution in [182362](https://github.com/flutter/flutter/pull/182362) +* @nmfisher made their first contribution in [182999](https://github.com/flutter/flutter/pull/182999) +* @SpiralMomentum made their first contribution in [183070](https://github.com/flutter/flutter/pull/183070) +* @wangfeihang made their first contribution in [180563](https://github.com/flutter/flutter/pull/180563) +* @spydon made their first contribution in [182934](https://github.com/flutter/flutter/pull/182934) +* @Laurie-Lin made their first contribution in [181889](https://github.com/flutter/flutter/pull/181889) +* @Eyas made their first contribution in [176881](https://github.com/flutter/flutter/pull/176881) +* @lamek made their first contribution in [182778](https://github.com/flutter/flutter/pull/182778) +* @sanketudaypatil made their first contribution in [183061](https://github.com/flutter/flutter/pull/183061) +* @gktirkha made their first contribution in [180789](https://github.com/flutter/flutter/pull/180789) +* @mayanksharma9 made their first contribution in [183351](https://github.com/flutter/flutter/pull/183351) +* @NamanGoyalK made their first contribution in [183375](https://github.com/flutter/flutter/pull/183375) +* @algor made their first contribution in [183680](https://github.com/flutter/flutter/pull/183680) +* @b055man made their first contribution in [184131](https://github.com/flutter/flutter/pull/184131) +* @Silfalion made their first contribution in [183724](https://github.com/flutter/flutter/pull/183724) +* @nikb7 made their first contribution in [183650](https://github.com/flutter/flutter/pull/183650) +* @TrangLeQuynh made their first contribution in [183488](https://github.com/flutter/flutter/pull/183488) + +**Full Changelog**: https://github.com/flutter/flutter/compare/3.41.0...3.44.0-0.3.pre From e94d94e54bc1bafb918762b58462fee7de42d997 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Fri, 15 May 2026 20:43:35 -0500 Subject: [PATCH 09/28] Enable running site-specific tests (#13387) Contributes to https://github.com/flutter/website/issues/13148 --- .../dash_site/lib/src/commands/test_dart.dart | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/tool/dash_site/lib/src/commands/test_dart.dart b/tool/dash_site/lib/src/commands/test_dart.dart index 81f61d6cb1..3f86771a5a 100644 --- a/tool/dash_site/lib/src/commands/test_dart.dart +++ b/tool/dash_site/lib/src/commands/test_dart.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'package:args/command_runner.dart'; import 'package:path/path.dart' as path; +import '../sites.dart'; import '../utils.dart'; final class TestDartCommand extends Command { @@ -21,7 +22,7 @@ final class TestDartCommand extends Command { } @override - String get description => 'Run tests on the site infra and examples.'; + String get description => 'Run tests on the sites, site infra, and examples.'; @override String get name => 'test-dart'; @@ -32,16 +33,24 @@ final class TestDartCommand extends Command { } Future _testDart({bool verboseLogging = false}) async { - final directoriesToTest = [ - path.join('tool', 'dash_site'), - ...exampleProjectDirectories, + final directoriesToTest = <(String directory, String executable)>[ + (path.join('tool', 'dash_site'), 'dart'), + for (final site in Site.values) + if (Directory(path.join(site.directory, 'test')).existsSync()) + (site.directory, 'dart'), + for (final directory in exampleProjectDirectories) (directory, 'flutter'), ]; print('Testing code...'); final failedTests = [ - for (final directory in directoriesToTest) - if (!(await testsPassInDirectory(directory, verboseLogging))) directory, + for (final (directory, executable) in directoriesToTest) + if (!(await testsPassInDirectory( + directory, + verboseLogging, + executable: executable, + ))) + directory, ]; if (failedTests.isNotEmpty) { @@ -54,23 +63,28 @@ Future _testDart({bool verboseLogging = false}) async { return 0; } -Future testsPassInDirectory(String directory, bool verboseLogging) async { +Future testsPassInDirectory( + String directory, + bool verboseLogging, { + String executable = 'flutter', +}) async { if (verboseLogging) { - print('Testing code in $directory...'); + print('Testing code in $directory with $executable test...'); } - final flutterTestOutput = await Process.run('flutter', [ + final testOutput = await Process.run(executable, [ 'test', '--reporter', 'expanded', // Non-animated expanded output looks better in CI and logs. ], workingDirectory: directory); - if (flutterTestOutput.exitCode != 0) { - final normalOutput = flutterTestOutput.stdout.toString(); - final errorOutput = flutterTestOutput.stderr.toString(); + if (testOutput.exitCode != 0) { + final normalOutput = testOutput.stdout.toString(); + final errorOutput = testOutput.stderr.toString(); // It's ok if the test directory is not found. if (!errorOutput.contains('No test') && + !normalOutput.contains('No test files were passed') && !normalOutput.contains('Could not find package `test`') && !normalOutput.contains('No tests were') && !errorOutput.contains(RegExp(r'Test directory.*not found'))) { From 7f5df54b241f6d48c2a727b982d7655de89a822f Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Fri, 15 May 2026 21:08:24 -0500 Subject: [PATCH 10/28] Update check links to support different sites (#13386) Update the `dart run check-links` command to support different sites. Also add validation of the configured emulator port. Contributes to https://github.com/flutter/website/issues/13148 --- .../lib/src/commands/check_links.dart | 57 ++++++----- .../src/commands/verify_firebase_json.dart | 94 ++++++++++++++----- tool/dash_site/lib/src/sites.dart | 31 +++++- 3 files changed, 137 insertions(+), 45 deletions(-) diff --git a/tool/dash_site/lib/src/commands/check_links.dart b/tool/dash_site/lib/src/commands/check_links.dart index 935031574e..3a4c7394f0 100644 --- a/tool/dash_site/lib/src/commands/check_links.dart +++ b/tool/dash_site/lib/src/commands/check_links.dart @@ -9,6 +9,7 @@ import 'package:args/command_runner.dart'; import 'package:linkcheck/linkcheck.dart' as linkcheck show run; import 'package:path/path.dart' as path; +import '../sites.dart'; import '../utils.dart'; final class CheckLinksCommand extends Command { @@ -30,15 +31,12 @@ final class CheckLinksCommand extends Command { String get name => 'check-links'; @override - Future run() async => - _checkLinks(checkExternal: argResults.get(_externalFlag, false)); + Future run() async => _checkLinks( + site: selectedSite, + checkExternal: argResults.get(_externalFlag, false), + ); } -/// The port that the firebase emulator runs on by default. -/// This must match what's declared in the `firebase.json` -/// and can't be 5000, since Airplay uses it. -const int _emulatorPort = 5502; - /// The path from root where the linkcheck skip list lives. final String _skipFilePath = path.join( 'tool', @@ -46,10 +44,15 @@ final String _skipFilePath = path.join( 'linkcheck-skip-list.txt', ); -Future _checkLinks({bool checkExternal = false}) async { - if (await _isPortInUse(_emulatorPort)) { +Future _checkLinks({ + required Site site, + bool checkExternal = false, +}) async { + final emulatorPort = site.firebaseEmulatorPort; + + if (await _isPortInUse(emulatorPort)) { stderr.writeln( - 'Error: Port $_emulatorPort is already in use! ' + 'Error: Port $emulatorPort is already in use! ' 'Are you running the emulator elsewhere?', ); return 1; @@ -67,15 +70,27 @@ Future _checkLinks({bool checkExternal = false}) async { 'Using firebase-tools $firebaseToolsVersion to start the ' 'Firebase hosting emulator asynchronously...', ); - final emulatorProcess = await Process.start('firebase', const [ - 'emulators:start', - '--only', - 'hosting', - '--project', - 'default', - '--log-verbosity', - 'QUIET', - ], mode: ProcessStartMode.inheritStdio); + final firebaseConfigDirectory = path.join( + repositoryRoot, + site.firebaseConfigDirectory, + ); + final firebaseConfigFileName = path.basename(site.firebaseConfigPath); + final emulatorProcess = await Process.start( + 'firebase', + [ + 'emulators:start', + '--only', + 'hosting', + '--project', + 'default', + '--config', + firebaseConfigFileName, + '--log-verbosity', + 'QUIET', + ], + workingDirectory: firebaseConfigDirectory, + mode: ProcessStartMode.inheritStdio, + ); print('Connecting to the emulator...'); // Give the emulator a few seconds to start up. @@ -83,14 +98,14 @@ Future _checkLinks({bool checkExternal = false}) async { try { // Check to see if the emulator is running. - if (!(await _isPortInUse(_emulatorPort))) { + if (!(await _isPortInUse(emulatorPort))) { stderr.writeln('Error: The Firebase hosting emulator did not start!'); return 1; } try { final result = await linkcheck.run([ - ':$_emulatorPort', + ':$emulatorPort', '--skip-file', _skipFilePath, if (checkExternal) 'external', diff --git a/tool/dash_site/lib/src/commands/verify_firebase_json.dart b/tool/dash_site/lib/src/commands/verify_firebase_json.dart index 05642e8d52..bbb2b6555b 100644 --- a/tool/dash_site/lib/src/commands/verify_firebase_json.dart +++ b/tool/dash_site/lib/src/commands/verify_firebase_json.dart @@ -6,26 +6,31 @@ import 'dart:convert'; import 'dart:io'; import 'package:args/command_runner.dart'; +import 'package:path/path.dart' as path; + +import '../sites.dart'; +import '../utils.dart'; final class VerifyFirebaseJsonCommand extends Command { @override String get description => - 'Verify the firebase.json file is valid and ' + "Verify the site's Firebase config is valid and " 'meets the site standards.'; @override String get name => 'verify-firebase-json'; @override - Future run() async => _verifyFirebaseJson(); + Future run() async => _verifyFirebaseJson(selectedSite); } -int _verifyFirebaseJson() { - final firebaseFile = File('firebase.json'); +int _verifyFirebaseJson(Site site) { + final firebasePath = path.join(repositoryRoot, site.firebaseConfigPath); + final firebaseFile = File(firebasePath); if (!firebaseFile.existsSync()) { stderr.writeln( - 'Cannot find the firebase.json file in the current directory.', + 'Cannot find the ${site.name} Firebase config at $firebasePath.', ); return 1; } @@ -39,23 +44,30 @@ int _verifyFirebaseJson() { if (hostingConfig == null) { stderr.writeln( - "Error: The firebase.json file is missing a top-level 'hosting' entry.", + 'Error: The ${site.name} Firebase config is ' + "missing a top-level 'hosting' entry.", ); return 1; } + if (!_verifyHostingEmulatorPort(firebaseConfig, site)) { + return 1; + } + final redirects = hostingConfig['redirects']; if (redirects == null) { stdout.writeln( - 'There are no redirects specified within the firebase.json file.', + 'There are no redirects specified in ' + 'the ${site.name} Firebase config.', ); return 0; } if (redirects is! List) { stderr.writeln( - "Error: The firebase.json file's 'redirect' entry is not a list.", + "Error: The ${site.name} Firebase config 'hosting.redirects' " + 'entry is not a list.', ); return 1; } @@ -71,8 +83,8 @@ int _verifyFirebaseJson() { for (final redirect in redirects) { if (redirect is! Map) { stderr.writeln( - 'Error: Each redirect must be a map containing ' - "a 'source' or 'regex' field.", + 'Error: Each redirect in the ${site.name} Firebase config must be ' + "a map containing a 'source' or 'regex' field.", ); return 1; } @@ -80,7 +92,7 @@ int _verifyFirebaseJson() { final source = redirect['source'] ?? redirect['regex']; if (source == null) { stderr.writeln( - 'Error: The firebase.json file has a ' + 'Error: The ${site.name} Firebase config has a ' "redirect missing a 'source' or 'regex'.", ); return 1; @@ -88,7 +100,7 @@ int _verifyFirebaseJson() { if (source is! String) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has a ' + 'Error: The ${site.name} Firebase config redirect $redirect has a ' "'source' or 'regex' specified which is not a string.", ); return 1; @@ -96,14 +108,17 @@ int _verifyFirebaseJson() { if (source.isEmpty) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has an ' + 'Error: The ${site.name} Firebase config redirect $redirect has an ' "empty 'source' or 'regex'.", ); return 1; } if (sources.contains(source)) { - stderr.writeln("Error: Multiple redirects share the '$source' source."); + stderr.writeln( + 'Error: Multiple ${site.name} redirects ' + "share the '$source' source.", + ); duplicatesFound += 1; } @@ -113,7 +128,7 @@ int _verifyFirebaseJson() { if (destination == null) { stderr.writeln( - 'Error: The firebase.json file has a ' + 'Error: The ${site.name} Firebase config has a ' "redirect missing a 'destination'.", ); return 1; @@ -121,7 +136,7 @@ int _verifyFirebaseJson() { if (destination is! String) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has a ' + 'Error: The ${site.name} Firebase config redirect $redirect has a ' "'destination' specified which is not a string.", ); return 1; @@ -129,8 +144,8 @@ int _verifyFirebaseJson() { if (destination.isEmpty) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has ' - "an empty 'destination'.", + 'Error: The ${site.name} Firebase config redirect $redirect has an ' + "empty 'destination'.", ); return 1; } @@ -138,14 +153,15 @@ int _verifyFirebaseJson() { if (duplicatesFound > 0) { stderr.writeln( - 'Error: $duplicatesFound duplicate sources found ' - 'in the firebase.json redirects.', + 'Error: $duplicatesFound duplicate sources found in ' + 'the ${site.name} Firebase config redirects.', ); return 1; } } catch (e) { stderr.writeln( - 'Error: Encountered an error when loading the firebase.json file:', + 'Error: Encountered an error when loading ' + 'the ${site.name} Firebase config:', ); stderr.writeln(e); return 1; @@ -153,3 +169,39 @@ int _verifyFirebaseJson() { return 0; } + +/// Returns whether the Firebase hosting emulator port in +/// the [firebaseConfig] matches the one specified for [site]. +bool _verifyHostingEmulatorPort( + Map firebaseConfig, + Site site, +) { + final emulatorsConfig = firebaseConfig['emulators']; + if (emulatorsConfig is! Map) { + stderr.writeln( + 'Error: The ${site.name} Firebase config is ' + "missing a top-level 'emulators' entry.", + ); + return false; + } + + final hostingEmulatorConfig = emulatorsConfig['hosting']; + if (hostingEmulatorConfig is! Map) { + stderr.writeln( + 'Error: The ${site.name} Firebase config is ' + "missing an 'emulators.hosting' entry.", + ); + return false; + } + + final port = hostingEmulatorConfig['port']; + if (port != site.firebaseEmulatorPort) { + stderr.writeln( + "Error: The ${site.name} Firebase config 'emulators.hosting.port' " + 'value must be ${site.firebaseEmulatorPort}, but found $port.', + ); + return false; + } + + return true; +} diff --git a/tool/dash_site/lib/src/sites.dart b/tool/dash_site/lib/src/sites.dart index 41087e950b..83eb30b9a3 100644 --- a/tool/dash_site/lib/src/sites.dart +++ b/tool/dash_site/lib/src/sites.dart @@ -8,15 +8,40 @@ import 'package:path/path.dart' as path; /// The sites maintained in this repository. enum Site { /// The Flutter documentation site. - docs(baseUrl: 'https://docs.flutter.dev'); - - const Site({required this.baseUrl}); + docs( + baseUrl: 'https://docs.flutter.dev', + firebaseConfigPathSegments: ['firebase.json'], + firebaseEmulatorPort: 5502, + ); + + const Site({ + required this.baseUrl, + required this.firebaseConfigPathSegments, + required this.firebaseEmulatorPort, + }); /// The canonical base URL where this site is hosted in production. final String baseUrl; + /// The path segments for this site's Firebase config file. + final List firebaseConfigPathSegments; + + /// The hosting emulator port declared in this site's Firebase config. + /// + /// The value must match the `emulators.hosting.port` value in + /// the site's Firebase config (`firebase.json`) file. + /// Each site needs a unique port so the emulators can run concurrently, + /// and `5000` must be avoided since AirPlay can use it on macOS. + final int firebaseEmulatorPort; + /// The directory where this site's content and implementation is located. String get directory => path.join('sites', name); + + /// The location of this site's Firebase config file. + String get firebaseConfigPath => path.joinAll(firebaseConfigPathSegments); + + /// The directory containing this site's Firebase config file. + String get firebaseConfigDirectory => path.dirname(firebaseConfigPath); } /// The name of the global `--site` option. From 479384a48cd812ad918c98d13bf38a0e1e71e414 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Fri, 15 May 2026 22:15:33 -0500 Subject: [PATCH 11/28] Update more `dash_site` commands to support multiple sites (#13388) Contributes to https://github.com/flutter/website/issues/13148 --- tool/dash_site/lib/src/commands/build.dart | 100 +++++++++++------- .../dash_site/lib/src/commands/check_all.dart | 6 +- .../src/commands/check_link_references.dart | 12 ++- tool/dash_site/lib/src/commands/clean.dart | 12 ++- .../lib/src/commands/refresh_excerpts.dart | 9 +- tool/dash_site/lib/src/commands/serve.dart | 8 +- tool/dash_site/lib/src/sites.dart | 38 ++++++- tool/dash_site/lib/src/utils.dart | 3 - 8 files changed, 131 insertions(+), 57 deletions(-) diff --git a/tool/dash_site/lib/src/commands/build.dart b/tool/dash_site/lib/src/commands/build.dart index ed99969717..cd6e86065b 100644 --- a/tool/dash_site/lib/src/commands/build.dart +++ b/tool/dash_site/lib/src/commands/build.dart @@ -31,59 +31,77 @@ final class BuildSiteCommand extends Command { String get name => 'build'; @override - Future run() async { - installJasprCliIfNecessary(); - - final productionRelease = argResults.get(_releaseFlag, false); - final site = selectedSite; - - final process = await Process.start( - Platform.resolvedExecutable, - [ - 'pub', - 'global', - 'run', - 'jaspr_cli:jaspr', - 'build', - // Use build_web_compiler options specified in build.yaml instead of - // those specified by jaspr_cli. - '--no-managed-build-options', - '--sitemap-domain=${site.baseUrl}', - // Exclude secondary Markdown output files from sitemap. - r'--sitemap-exclude=\.html\.md$', - '--dart-define=PRODUCTION=$productionRelease', - ], - workingDirectory: site.directory, - mode: ProcessStartMode.inheritStdio, - ); + Future run() async => buildSite( + selectedSite, + productionRelease: argResults.get(_releaseFlag, false), + ); +} - final processExitCode = await process.exitCode; +Future buildSite(Site site, {required bool productionRelease}) async { + if (installJasprCliIfNecessary() case final jasprInstallResult + when jasprInstallResult != 0) { + return jasprInstallResult; + } - final originalOutputDirectoryPath = path.join( - repositoryRoot, - site.directory, + final process = await Process.start( + Platform.resolvedExecutable, + [ + 'pub', + 'global', + 'run', + 'jaspr_cli:jaspr', 'build', - 'jaspr', + // Use build_web_compiler options specified in build.yaml instead of + // those specified by jaspr_cli. + '--no-managed-build-options', + '--sitemap-domain=${site.baseUrl}', + // Exclude secondary Markdown output files from sitemap. + r'--sitemap-exclude=\.html\.md$', + '--dart-define=PRODUCTION=$productionRelease', + ], + workingDirectory: site.directory, + mode: ProcessStartMode.inheritStdio, + ); + + if (await process.exitCode case final processExitCode + when processExitCode != 0) { + return processExitCode; + } + + final originalOutputDirectoryPath = path.join( + repositoryRoot, + site.jasprBuildOutputDirectory, + ); + if (!Directory(originalOutputDirectoryPath).existsSync()) { + stderr.writeln( + 'Error: Jaspr output directory not found at: ' + '$originalOutputDirectoryPath', ); - if (!Directory(originalOutputDirectoryPath).existsSync()) { - stderr.writeln( - 'Error: Jaspr output directory not found at: ' - '$originalOutputDirectoryPath', - ); - return 1; + return 1; + } + + final siteOutputDirectoryPath = path.join( + repositoryRoot, + site.buildOutputDirectory, + ); + if (path.normalize(originalOutputDirectoryPath) != + path.normalize(siteOutputDirectoryPath)) { + final outputDirectory = Directory(siteOutputDirectoryPath); + if (outputDirectory.existsSync()) { + outputDirectory.deleteSync(recursive: true); } - // Copy the entire site output to the _site directory. + // Copy the entire site output to the configured output directory. io.copyPathSync(originalOutputDirectoryPath, siteOutputDirectoryPath); + } - _move404File(); + _move404File(siteOutputDirectoryPath); - return processExitCode; - } + return 0; } /// Moves the 404 file to the location expected by Firebase hosting. -void _move404File() { +void _move404File(String siteOutputDirectoryPath) { final initial404Directory = path.join(siteOutputDirectoryPath, '404'); final original404File = File(path.join(initial404Directory, 'index.html')); if (original404File.existsSync()) { diff --git a/tool/dash_site/lib/src/commands/check_all.dart b/tool/dash_site/lib/src/commands/check_all.dart index 4d33fee4cd..53d25364cf 100644 --- a/tool/dash_site/lib/src/commands/check_all.dart +++ b/tool/dash_site/lib/src/commands/check_all.dart @@ -19,11 +19,13 @@ final class CheckAllCommand extends Command { @override Future run() async { - const verificationTasks = [ + final selectedSite = this.selectedSite; + final verificationTasks = [ ['format-dart', '--check'], ['analyze-dart'], ['test-dart'], - ['refresh-excerpts', '--fail-on-update', '--dry-run'], + if (selectedSite.supportsCodeExcerpts) + ['refresh-excerpts', '--fail-on-update', '--dry-run'], ]; final siteName = selectedSite.name; diff --git a/tool/dash_site/lib/src/commands/check_link_references.dart b/tool/dash_site/lib/src/commands/check_link_references.dart index 5debe91e13..fb0d540d89 100644 --- a/tool/dash_site/lib/src/commands/check_link_references.dart +++ b/tool/dash_site/lib/src/commands/check_link_references.dart @@ -7,6 +7,9 @@ import 'dart:io'; import 'package:args/command_runner.dart'; import 'package:path/path.dart' as path; +import '../sites.dart'; +import '../utils.dart'; + final class CheckLinkReferencesCommand extends Command { @override String get description => @@ -17,13 +20,16 @@ final class CheckLinkReferencesCommand extends Command { String get name => 'check-link-references'; @override - Future run() async => _checkLinkReferences(); + Future run() async => _checkLinkReferences(selectedSite); } -int _checkLinkReferences() { +int _checkLinkReferences(Site site) { print('Checking for broken Markdown link references...'); - const generatedSiteDirectory = '_site'; + final generatedSiteDirectory = path.join( + repositoryRoot, + site.buildOutputDirectory, + ); final directory = Directory(generatedSiteDirectory); diff --git a/tool/dash_site/lib/src/commands/clean.dart b/tool/dash_site/lib/src/commands/clean.dart index c17eae29ac..faa292ee74 100644 --- a/tool/dash_site/lib/src/commands/clean.dart +++ b/tool/dash_site/lib/src/commands/clean.dart @@ -5,6 +5,7 @@ import 'dart:io'; import 'package:args/command_runner.dart'; +import 'package:path/path.dart' as path; import '../sites.dart'; import '../utils.dart'; @@ -22,7 +23,12 @@ final class CleanSiteCommand extends Command { Future run() async { print('Cleaning the Jaspr setup...'); - installJasprCliIfNecessary(); + if (installJasprCliIfNecessary() case final jasprInstallResult + when jasprInstallResult != 0) { + return jasprInstallResult; + } + + final selectedSite = this.selectedSite; final process = await Process.start( Platform.resolvedExecutable, @@ -34,7 +40,9 @@ final class CleanSiteCommand extends Command { final processExitCode = await process.exitCode; print('Cleaning the site output directory...'); - final outputDirectory = Directory(siteOutputDirectoryPath); + final outputDirectory = Directory( + path.join(repositoryRoot, selectedSite.buildOutputDirectory), + ); if (outputDirectory.existsSync()) { outputDirectory.deleteSync(recursive: true); } diff --git a/tool/dash_site/lib/src/commands/refresh_excerpts.dart b/tool/dash_site/lib/src/commands/refresh_excerpts.dart index b6e2525bc3..9f1558e0df 100644 --- a/tool/dash_site/lib/src/commands/refresh_excerpts.dart +++ b/tool/dash_site/lib/src/commands/refresh_excerpts.dart @@ -55,6 +55,13 @@ Future _refreshExcerpts({ bool dryRun = false, bool failOnUpdate = false, }) async { + if (!site.supportsCodeExcerpts) { + stderr.writeln( + 'Error: The ${site.name} site does not support code excerpts.', + ); + return 1; + } + final updater = Updater( baseSourcePath: path.join(repositoryRoot, 'examples'), defaultPlasterContent: '···', @@ -68,7 +75,7 @@ Future _refreshExcerpts({ print('Running the code excerpt updater...'); final updateResult = await updater.update( - path.join(repositoryRoot, site.directory, 'src', 'content'), + path.join(repositoryRoot, site.contentDirectory), makeUpdates: !dryRun, ); diff --git a/tool/dash_site/lib/src/commands/serve.dart b/tool/dash_site/lib/src/commands/serve.dart index 44d8d0621e..42361ca42a 100644 --- a/tool/dash_site/lib/src/commands/serve.dart +++ b/tool/dash_site/lib/src/commands/serve.dart @@ -26,9 +26,13 @@ final class ServeSiteCommand extends Command { @override Future run() async { - final release = argResults!.flag('release'); + if (installJasprCliIfNecessary() case final jasprInstallResult + when jasprInstallResult != 0) { + return jasprInstallResult; + } - installJasprCliIfNecessary(); + final release = argResults!.flag('release'); + final selectedSite = this.selectedSite; final process = await Process.start( Platform.resolvedExecutable, diff --git a/tool/dash_site/lib/src/sites.dart b/tool/dash_site/lib/src/sites.dart index 83eb30b9a3..155eb28aa0 100644 --- a/tool/dash_site/lib/src/sites.dart +++ b/tool/dash_site/lib/src/sites.dart @@ -9,19 +9,36 @@ import 'package:path/path.dart' as path; enum Site { /// The Flutter documentation site. docs( - baseUrl: 'https://docs.flutter.dev', + host: 'docs.flutter.dev', + buildOutputPathSegments: ['_site'], + contentPathSegments: ['src', 'content'], firebaseConfigPathSegments: ['firebase.json'], firebaseEmulatorPort: 5502, + supportsCodeExcerpts: true, ); const Site({ - required this.baseUrl, + required this.host, + required this.buildOutputPathSegments, + required this.contentPathSegments, required this.firebaseConfigPathSegments, required this.firebaseEmulatorPort, + this.supportsCodeExcerpts = false, }); + /// The host name where this site is served in production. + final String host; + /// The canonical base URL where this site is hosted in production. - final String baseUrl; + String get baseUrl => 'https://$host'; + + /// The path segments for this site's production build output directory, + /// relative to the repository root. + final List buildOutputPathSegments; + + /// The path segments for this site's content directory, + /// relative to the site's [directory]. + final List contentPathSegments; /// The path segments for this site's Firebase config file. final List firebaseConfigPathSegments; @@ -34,9 +51,24 @@ enum Site { /// and `5000` must be avoided since AirPlay can use it on macOS. final int firebaseEmulatorPort; + /// Whether this site supports code excerpts managed by `refresh-excerpts`. + final bool supportsCodeExcerpts; + /// The directory where this site's content and implementation is located. String get directory => path.join('sites', name); + /// The directory where this site's content is located. + String get contentDirectory => + path.joinAll([directory, ...contentPathSegments]); + + /// The directory where this site's production build output should end up. + String get buildOutputDirectory => path.joinAll(buildOutputPathSegments); + + /// The directory where Jaspr writes this site's production build, + /// before it is copied to [buildOutputDirectory] if different. + String get jasprBuildOutputDirectory => + path.join(directory, 'build', 'jaspr'); + /// The location of this site's Firebase config file. String get firebaseConfigPath => path.joinAll(firebaseConfigPathSegments); diff --git a/tool/dash_site/lib/src/utils.dart b/tool/dash_site/lib/src/utils.dart index 58f97f5c11..6e3f765812 100644 --- a/tool/dash_site/lib/src/utils.dart +++ b/tool/dash_site/lib/src/utils.dart @@ -22,9 +22,6 @@ final String repositoryRoot = () { return maybeRoot; }(); -/// The path of the site output directory. -final String siteOutputDirectoryPath = path.join(repositoryRoot, '_site'); - final bool _runningInCi = Platform.environment['CI'] == 'true'; int installJasprCliIfNecessary() { From 6aa581d6e6c6619d1c2486ee294615fe67ae784b Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Sun, 17 May 2026 13:54:04 -0500 Subject: [PATCH 12/28] Customize ports used by Jaspr during serving (#13389) This helps avoid conflicting with any other Jaspr sites you might happen to have running and additionally enables you to serve multiple of our own sites at the same time :D Contributes to https://github.com/flutter/website/issues/13148 --- tool/dash_site/lib/src/commands/serve.dart | 4 ++++ tool/dash_site/lib/src/sites.dart | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/tool/dash_site/lib/src/commands/serve.dart b/tool/dash_site/lib/src/commands/serve.dart index 42361ca42a..e770dd0e3f 100644 --- a/tool/dash_site/lib/src/commands/serve.dart +++ b/tool/dash_site/lib/src/commands/serve.dart @@ -33,6 +33,7 @@ final class ServeSiteCommand extends Command { final release = argResults!.flag('release'); final selectedSite = this.selectedSite; + final jasprPorts = selectedSite.jasprPorts; final process = await Process.start( Platform.resolvedExecutable, @@ -42,6 +43,9 @@ final class ServeSiteCommand extends Command { 'run', 'jaspr_cli:jaspr', 'serve', + '--port=${jasprPorts.serve}', + '--web-port=${jasprPorts.webDev}', + '--proxy-port=${jasprPorts.proxy}', // Use build_web_compiler options specified in build.yaml instead of // those specified by jaspr_cli. '--no-managed-build-options', diff --git a/tool/dash_site/lib/src/sites.dart b/tool/dash_site/lib/src/sites.dart index 155eb28aa0..b7a0b01289 100644 --- a/tool/dash_site/lib/src/sites.dart +++ b/tool/dash_site/lib/src/sites.dart @@ -74,11 +74,27 @@ enum Site { /// The directory containing this site's Firebase config file. String get firebaseConfigDirectory => path.dirname(firebaseConfigPath); + + /// The ports Jaspr uses when serving this site locally. + /// + /// Each port is derived from this site's declaration order in [Site] so + /// that multiple sites can be served concurrently without port conflicts. + /// Each is offset by one past Jaspr's default to avoid colliding with a + /// separate Jaspr project running with default port configuration. + ({int serve, int webDev, int proxy}) get jasprPorts => ( + serve: _jasprDefaultSitePort + index + 1, + webDev: _jasprDefaultWebDevPort + index + 1, + proxy: _jasprDefaultProxyPort + index + 1, + ); } /// The name of the global `--site` option. const String siteOptionName = 'site'; +const int _jasprDefaultSitePort = 8080; +const int _jasprDefaultWebDevPort = 5467; +const int _jasprDefaultProxyPort = 5567; + extension CommandSiteResolution on Command { /// The [Site] selected with the global `--site` option, /// defaulting to [Site.docs]. From a60768d6caddd75302dd3f82d5bed8f9efc7f8f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 12:06:36 -0500 Subject: [PATCH 13/28] Bump github/codeql-action from 4.35.4 to 4.35.5 in the github-actions group (#13395) Bumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 4.35.4 to 4.35.5
Release notes

Sourced from github/codeql-action's releases.

v4.35.5

  • We have improved how the JavaScript bundles for the CodeQL Action are generated to avoid duplication across bundles and reduce the size of the repository by around 70%. This should have no effect on the runtime behaviour of the CodeQL Action. #3899
  • For performance and accuracy reasons, improved incremental analysis will now only be enabled on a pull request when diff-informed analysis is also enabled for that run. If diff-informed analysis is unavailable (for example, because the PR diff ranges could not be computed), the action will fall back to a full analysis. #3791
  • If multiple inputs are provided for the GitHub-internal analysis-kinds input, only code-scanning will be enabled. The analysis-kinds input is experimental, for GitHub-internal use only, and may change without notice at any time. #3892
  • Added an experimental change which, when running a Code Scanning analysis for a PR with improved incremental analysis enabled, prefers CodeQL CLI versions that have a cached overlay-base database for the configured languages. This speeds up analysis for a repository when there is not yet a cached overlay-base database for the latest CLI version. We expect to roll this change out to everyone in May. #3880
Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

[UNRELEASED]

  • Add support for SHA-256 Git object IDs. #3893

4.35.5 - 15 May 2026

  • We have improved how the JavaScript bundles for the CodeQL Action are generated to avoid duplication across bundles and reduce the size of the repository by around 70%. This should have no effect on the runtime behaviour of the CodeQL Action. #3899
  • For performance and accuracy reasons, improved incremental analysis will now only be enabled on a pull request when diff-informed analysis is also enabled for that run. If diff-informed analysis is unavailable (for example, because the PR diff ranges could not be computed), the action will fall back to a full analysis. #3791
  • If multiple inputs are provided for the GitHub-internal analysis-kinds input, only code-scanning will be enabled. The analysis-kinds input is experimental, for GitHub-internal use only, and may change without notice at any time. #3892
  • Added an experimental change which, when running a Code Scanning analysis for a PR with improved incremental analysis enabled, prefers CodeQL CLI versions that have a cached overlay-base database for the configured languages. This speeds up analysis for a repository when there is not yet a cached overlay-base database for the latest CLI version. We expect to roll this change out to everyone in May. #3880

4.35.4 - 07 May 2026

  • Update default CodeQL bundle version to 2.25.4. #3881

4.35.3 - 01 May 2026

  • Upcoming breaking change: Add a deprecation warning for customers using CodeQL version 2.19.3 and earlier. These versions of CodeQL were discontinued on 9 April 2026 alongside GitHub Enterprise Server 3.15, and will be unsupported by the next minor release of the CodeQL Action. #3837
  • Configurations for private registries that use Cloudsmith or GCP OIDC are now accepted. #3850
  • Best-effort connection tests for private registries now use GET requests instead of HEAD for better compatibility with various registry implementations. For NuGet feeds, the test is now always performed against the service index. #3853
  • Fixed a bug where two diagnostics produced within the same millisecond could overwrite each other on disk, causing one of them to be lost. #3852
  • Update default CodeQL bundle version to 2.25.3. #3865

4.35.2 - 15 Apr 2026

  • The undocumented TRAP cache cleanup feature that could be enabled using the CODEQL_ACTION_CLEANUP_TRAP_CACHES environment variable is deprecated and will be removed in May 2026. If you are affected by this, we recommend disabling TRAP caching by passing the trap-caching: false input to the init Action. #3795
  • The Git version 2.36.0 requirement for improved incremental analysis now only applies to repositories that contain submodules. #3789
  • Python analysis on GHES no longer extracts the standard library, relying instead on models of the standard library. This should result in significantly faster extraction and analysis times, while the effect on alerts should be minimal. #3794
  • Fixed a bug in the validation of OIDC configurations for private registries that was added in CodeQL Action 4.33.0 / 3.33.0. #3807
  • Update default CodeQL bundle version to 2.25.2. #3823

4.35.1 - 27 Mar 2026

4.35.0 - 27 Mar 2026

4.34.1 - 20 Mar 2026

  • Downgrade default CodeQL bundle version to 2.24.3 due to issues with a small percentage of Actions and JavaScript analyses. #3762

4.34.0 - 20 Mar 2026

... (truncated)

Commits
  • 9e0d7b8 Merge pull request #3905 from github/update-v4.35.5-d4b485515
  • 6d7d599 Add changelog entry for #3899
  • 51f7e38 Update changelog for v4.35.5
  • d4b4855 Merge pull request #3899 from github/mbg/esbuild/split
  • 127de81 Merge remote-tracking branch 'origin/main' into mbg/esbuild/split
  • 7fde13f Use src + basename in header to avoid issues on Windows
  • dfa61e7 Improve pattern matching and error handling
  • 52aafec Import and call runWrapper normally in analyze tests
  • 0d08c01 Auto-generate shared bundle
  • 14085a6 Auto-generate entry points
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=4.35.4&new-version=4.35.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c47bd4646b..e4045920e9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e + uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -44,7 +44,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@68bde559dea0fdcac2102bfdf6230c5f70eb485e + uses: github/codeql-action/autobuild@9e0d7b8d25671d64c341c19c0152d693099fb5ba # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -58,4 +58,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@68bde559dea0fdcac2102bfdf6230c5f70eb485e + uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba From 4c36d9f2ca3d5e0779acd6982e72f6d9480c2e10 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Mon, 18 May 2026 12:25:11 -0500 Subject: [PATCH 14/28] [3.44] Account for deprecation of `builder` parameter of `showCupertinoSheet` (#13362) --- examples/cookbook/design/cupertino_sheets/lib/main.dart | 3 ++- .../docs/src/content/cookbook/design/cupertino-sheets.md | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/cookbook/design/cupertino_sheets/lib/main.dart b/examples/cookbook/design/cupertino_sheets/lib/main.dart index 5a6e681191..535d500d73 100644 --- a/examples/cookbook/design/cupertino_sheets/lib/main.dart +++ b/examples/cookbook/design/cupertino_sheets/lib/main.dart @@ -31,8 +31,9 @@ class CupertinoSheetPage extends StatelessWidget { // #docregion ShowCupertinoSheet showCupertinoSheet( context: context, - builder: (context) { + scrollableBuilder: (context, scrollController) { return SingleChildScrollView( + controller: scrollController, child: Center( child: Column( mainAxisSize: MainAxisSize.min, diff --git a/sites/docs/src/content/cookbook/design/cupertino-sheets.md b/sites/docs/src/content/cookbook/design/cupertino-sheets.md index e0ae83e13a..0b00b9d8db 100644 --- a/sites/docs/src/content/cookbook/design/cupertino-sheets.md +++ b/sites/docs/src/content/cookbook/design/cupertino-sheets.md @@ -42,15 +42,16 @@ class CupertinoSheetDemo extends StatelessWidget { ## 2. Display the sheet content With the basic app structure in place, display the sheet. -To show it, call `showCupertinoSheet` and provide a `builder` +To show it, call `showCupertinoSheet` and provide a `scrollableBuilder` that returns the content for the sheet, such as a `SingleChildScrollView`. ```dart showCupertinoSheet( context: context, - builder: (context) { + scrollableBuilder: (context, scrollController) { return SingleChildScrollView( + controller: scrollController, child: Center( child: Column( mainAxisSize: MainAxisSize.min, @@ -107,8 +108,9 @@ class CupertinoSheetPage extends StatelessWidget { onPressed: () { showCupertinoSheet( context: context, - builder: (context) { + scrollableBuilder: (context, scrollController) { return SingleChildScrollView( + controller: scrollController, child: Center( child: Column( mainAxisSize: MainAxisSize.min, From 34559722f45221073dd27917ead53bd845d1ec9c Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Mon, 18 May 2026 13:20:51 -0500 Subject: [PATCH 15/28] Update SDK constraints and code for Dart 3.12 (#13397) --- examples/_animation/basic_hero_animation/pubspec.yaml | 2 +- .../basic_radial_hero_animation/pubspec.yaml | 2 +- .../_animation/basic_staggered_animation/pubspec.yaml | 2 +- examples/_animation/hero_animation/pubspec.yaml | 2 +- examples/_animation/radial_hero_animation/pubspec.yaml | 2 +- .../pubspec.yaml | 2 +- .../_animation/staggered_pic_selection/pubspec.yaml | 2 +- examples/accessibility/pubspec.yaml | 2 +- examples/analysis_options.yaml | 1 + examples/animation/animate0/pubspec.yaml | 2 +- examples/animation/animate1/pubspec.yaml | 2 +- examples/animation/animate2/pubspec.yaml | 2 +- examples/animation/animate3/pubspec.yaml | 2 +- examples/animation/animate4/pubspec.yaml | 2 +- examples/animation/animate5/pubspec.yaml | 2 +- examples/app-architecture/command/pubspec.yaml | 2 +- .../lib/data/repositories/user_profile_repository.dart | 7 +++---- .../lib/ui/user_profile/user_profile_viewmodel.dart | 3 +-- examples/app-architecture/offline_first/pubspec.yaml | 2 +- .../app-architecture/optimistic_state/pubspec.yaml | 2 +- examples/app-architecture/result/pubspec.yaml | 2 +- .../lib/data/repositories/todo_repository.dart | 2 +- .../ui/todo_list/viewmodel/todo_list_viewmodel.dart | 3 +-- .../app-architecture/todo_data_service/pubspec.yaml | 2 +- .../cookbook/animation/animated_container/pubspec.yaml | 2 +- .../cookbook/animation/opacity_animation/pubspec.yaml | 2 +- .../animation/page_route_animation/pubspec.yaml | 2 +- .../cookbook/animation/physics_simulation/pubspec.yaml | 2 +- examples/cookbook/design/cupertino_sheets/pubspec.yaml | 2 +- examples/cookbook/design/drawer/pubspec.yaml | 2 +- examples/cookbook/design/fonts/pubspec.yaml | 2 +- examples/cookbook/design/orientation/pubspec.yaml | 2 +- examples/cookbook/design/package_fonts/pubspec.yaml | 2 +- examples/cookbook/design/snackbars/pubspec.yaml | 2 +- examples/cookbook/design/tabs/pubspec.yaml | 2 +- examples/cookbook/design/themes/pubspec.yaml | 2 +- .../cookbook/effects/download_button/lib/main.dart | 10 ++++------ examples/cookbook/effects/download_button/pubspec.yaml | 2 +- examples/cookbook/effects/drag_a_widget/pubspec.yaml | 2 +- examples/cookbook/effects/expandable_fab/pubspec.yaml | 2 +- examples/cookbook/effects/nested_nav/pubspec.yaml | 2 +- .../cookbook/effects/parallax_scrolling/lib/main.dart | 3 +-- .../cookbook/effects/parallax_scrolling/pubspec.yaml | 2 +- examples/cookbook/effects/shimmer_loading/pubspec.yaml | 2 +- .../effects/staggered_menu_animation/pubspec.yaml | 2 +- examples/cookbook/forms/focus/pubspec.yaml | 2 +- examples/cookbook/forms/retrieve_input/pubspec.yaml | 2 +- .../cookbook/forms/text_field_changes/pubspec.yaml | 2 +- examples/cookbook/forms/text_input/pubspec.yaml | 2 +- examples/cookbook/forms/validation/pubspec.yaml | 2 +- .../games/achievements_leaderboards/pubspec.yaml | 2 +- .../cookbook/games/firestore_multiplayer/pubspec.yaml | 2 +- examples/cookbook/gestures/dismissible/pubspec.yaml | 2 +- examples/cookbook/gestures/handling_taps/pubspec.yaml | 2 +- examples/cookbook/gestures/ripples/pubspec.yaml | 2 +- examples/cookbook/images/cached_images/pubspec.yaml | 2 +- examples/cookbook/images/fading_in_images/pubspec.yaml | 2 +- examples/cookbook/images/network_image/pubspec.yaml | 2 +- examples/cookbook/lists/basic_list/pubspec.yaml | 2 +- examples/cookbook/lists/floating_app_bar/pubspec.yaml | 2 +- examples/cookbook/lists/grid_lists/pubspec.yaml | 2 +- examples/cookbook/lists/horizontal_list/pubspec.yaml | 2 +- examples/cookbook/lists/long_lists/pubspec.yaml | 2 +- examples/cookbook/lists/mixed_list/pubspec.yaml | 2 +- examples/cookbook/lists/spaced_items/pubspec.yaml | 2 +- .../cookbook/maintenance/error_reporting/pubspec.yaml | 2 +- .../cookbook/navigation/hero_animations/pubspec.yaml | 2 +- examples/cookbook/navigation/named_routes/pubspec.yaml | 2 +- .../navigation/navigate_with_arguments/pubspec.yaml | 2 +- .../cookbook/navigation/navigation_basics/pubspec.yaml | 2 +- examples/cookbook/navigation/passing_data/pubspec.yaml | 2 +- .../cookbook/navigation/returning_data/pubspec.yaml | 2 +- .../networking/authenticated_requests/pubspec.yaml | 2 +- .../networking/background_parsing/pubspec.yaml | 2 +- examples/cookbook/networking/delete_data/pubspec.yaml | 2 +- examples/cookbook/networking/fetch_data/pubspec.yaml | 2 +- examples/cookbook/networking/send_data/pubspec.yaml | 2 +- examples/cookbook/networking/update_data/pubspec.yaml | 2 +- examples/cookbook/networking/web_sockets/pubspec.yaml | 2 +- examples/cookbook/persistence/key_value/pubspec.yaml | 2 +- .../persistence/reading_writing_files/pubspec.yaml | 2 +- examples/cookbook/persistence/sqlite/pubspec.yaml | 2 +- .../cookbook/plugins/google_mobile_ads/pubspec.yaml | 2 +- .../cookbook/plugins/picture_using_camera/pubspec.yaml | 2 +- examples/cookbook/plugins/play_video/pubspec.yaml | 2 +- .../testing/integration/introduction/pubspec.yaml | 2 +- .../testing/integration/profiling/pubspec.yaml | 2 +- .../cookbook/testing/unit/counter_app/pubspec.yaml | 2 +- examples/cookbook/testing/unit/mocking/pubspec.yaml | 2 +- examples/cookbook/testing/widget/finders/pubspec.yaml | 2 +- .../cookbook/testing/widget/introduction/pubspec.yaml | 2 +- .../testing/widget/orientation_tests/pubspec.yaml | 2 +- .../cookbook/testing/widget/scrolling/pubspec.yaml | 2 +- examples/cookbook/testing/widget/tap_drag/pubspec.yaml | 2 +- examples/data-and-backend/json/pubspec.yaml | 2 +- examples/deployment/obfuscate/pubspec.yaml | 2 +- examples/fwe/birdle/pubspec.yaml | 2 +- examples/fwe/rolodex/pubspec.yaml | 2 +- examples/fwe/wikipedia_reader/pubspec.yaml | 2 +- .../get-started/flutter-for/android_devs/pubspec.yaml | 2 +- .../get-started/flutter-for/declarative/pubspec.yaml | 2 +- examples/get-started/flutter-for/ios_devs/pubspec.yaml | 2 +- .../react_native_devs/my_widgets/pubspec.yaml | 2 +- .../flutter-for/react_native_devs/pubspec.yaml | 2 +- examples/get-started/flutter-for/web_devs/pubspec.yaml | 2 +- .../get-started/flutter-for/xamarin_devs/pubspec.yaml | 2 +- examples/googleapis/pubspec.yaml | 2 +- examples/integration_test/pubspec.yaml | 2 +- examples/integration_test_migration/pubspec.yaml | 2 +- .../internationalization/add_language/pubspec.yaml | 2 +- .../internationalization/gen_l10n_example/pubspec.yaml | 2 +- .../internationalization/intl_example/pubspec.yaml | 2 +- examples/internationalization/minimal/pubspec.yaml | 2 +- examples/layout/base/pubspec.yaml | 2 +- examples/layout/card_and_stack/pubspec.yaml | 2 +- examples/layout/constraints/pubspec.yaml | 2 +- examples/layout/container/pubspec.yaml | 2 +- examples/layout/gallery/pubspec.yaml | 2 +- examples/layout/grid_and_list/pubspec.yaml | 2 +- examples/layout/lakes/interactive/pubspec.yaml | 2 +- examples/layout/lakes/step2/pubspec.yaml | 2 +- examples/layout/lakes/step3/pubspec.yaml | 2 +- examples/layout/lakes/step4/pubspec.yaml | 2 +- examples/layout/lakes/step5/pubspec.yaml | 2 +- examples/layout/lakes/step6/pubspec.yaml | 2 +- examples/layout/non_material/pubspec.yaml | 2 +- examples/layout/pavlova/pubspec.yaml | 2 +- examples/layout/row_column/pubspec.yaml | 2 +- examples/layout/sizing/pubspec.yaml | 2 +- examples/perf/concurrency/isolates/pubspec.yaml | 2 +- examples/perf/deferred_components/pubspec.yaml | 2 +- .../compose_activities/pubspec.yaml | 2 +- examples/platform_integration/pigeon/pubspec.yaml | 2 +- .../platform_channels/pubspec.yaml | 2 +- .../platform_integration/platform_views/pubspec.yaml | 2 +- .../plugin_api_migration/pubspec.yaml | 2 +- examples/pubspec.yaml | 2 +- examples/resources/architectural_overview/pubspec.yaml | 2 +- examples/resources/dart_swift_concurrency/pubspec.yaml | 2 +- examples/state_mgmt/simple/pubspec.yaml | 2 +- examples/testing/code_debugging/pubspec.yaml | 2 +- examples/testing/common_errors/pubspec.yaml | 2 +- examples/testing/errors/lib/excerpts.dart | 2 +- examples/testing/errors/lib/main.dart | 2 +- examples/testing/errors/lib/quit_immediate.dart | 2 +- examples/testing/errors/pubspec.yaml | 2 +- examples/testing/integration_tests/how_to/pubspec.yaml | 2 +- examples/testing/native_debugging/pubspec.yaml | 2 +- examples/tools/pubspec.yaml | 2 +- examples/ui/actions_and_shortcuts/pubspec.yaml | 2 +- examples/ui/adaptive_app_demos/pubspec.yaml | 2 +- examples/ui/assets_and_images/pubspec.yaml | 2 +- examples/ui/focus/pubspec.yaml | 2 +- examples/ui/interactive/pubspec.yaml | 2 +- examples/ui/navigation/pubspec.yaml | 2 +- examples/ui/widgets_intro/pubspec.yaml | 2 +- examples/visual_debugging/pubspec.yaml | 2 +- packages/analysis_defaults/pubspec.yaml | 2 +- packages/excerpter/pubspec.yaml | 2 +- pubspec.yaml | 2 +- .../lib/src/components/dartpad/embedded_dartpad.dart | 6 +++--- sites/docs/pubspec.yaml | 2 +- .../content/app-architecture/design-patterns/sql.md | 2 +- .../src/content/cookbook/effects/download-button.md | 10 ++++------ .../src/content/cookbook/effects/parallax-scrolling.md | 3 +-- sites/docs/src/content/tools/pubspec.md | 2 +- sites/docs/src/data/site.yml | 2 +- tool/dash_site/pubspec.yaml | 2 +- 168 files changed, 178 insertions(+), 186 deletions(-) diff --git a/examples/_animation/basic_hero_animation/pubspec.yaml b/examples/_animation/basic_hero_animation/pubspec.yaml index 452cb540e7..c7c6f716d9 100644 --- a/examples/_animation/basic_hero_animation/pubspec.yaml +++ b/examples/_animation/basic_hero_animation/pubspec.yaml @@ -5,7 +5,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/basic_radial_hero_animation/pubspec.yaml b/examples/_animation/basic_radial_hero_animation/pubspec.yaml index e09286c618..f7734ebdc0 100644 --- a/examples/_animation/basic_radial_hero_animation/pubspec.yaml +++ b/examples/_animation/basic_radial_hero_animation/pubspec.yaml @@ -6,7 +6,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/basic_staggered_animation/pubspec.yaml b/examples/_animation/basic_staggered_animation/pubspec.yaml index e5eadb49c2..21d9d66382 100644 --- a/examples/_animation/basic_staggered_animation/pubspec.yaml +++ b/examples/_animation/basic_staggered_animation/pubspec.yaml @@ -4,7 +4,7 @@ description: An introductory example to staggered animations. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/hero_animation/pubspec.yaml b/examples/_animation/hero_animation/pubspec.yaml index 8e00c7d92b..07a1215608 100644 --- a/examples/_animation/hero_animation/pubspec.yaml +++ b/examples/_animation/hero_animation/pubspec.yaml @@ -4,7 +4,7 @@ description: Shows how to create a simple Hero transition. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/radial_hero_animation/pubspec.yaml b/examples/_animation/radial_hero_animation/pubspec.yaml index f0a50efef7..4bc3d29712 100644 --- a/examples/_animation/radial_hero_animation/pubspec.yaml +++ b/examples/_animation/radial_hero_animation/pubspec.yaml @@ -6,7 +6,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml b/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml index 140956d18b..c23d465690 100644 --- a/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml +++ b/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml @@ -6,7 +6,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/staggered_pic_selection/pubspec.yaml b/examples/_animation/staggered_pic_selection/pubspec.yaml index 0b86b29dec..2b64c84e2d 100644 --- a/examples/_animation/staggered_pic_selection/pubspec.yaml +++ b/examples/_animation/staggered_pic_selection/pubspec.yaml @@ -4,7 +4,7 @@ description: A more complex staggered animation example. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/accessibility/pubspec.yaml b/examples/accessibility/pubspec.yaml index 08ac73ef9b..c47638aebf 100644 --- a/examples/accessibility/pubspec.yaml +++ b/examples/accessibility/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/analysis_options.yaml b/examples/analysis_options.yaml index a53c0054de..ec6294795d 100644 --- a/examples/analysis_options.yaml +++ b/examples/analysis_options.yaml @@ -37,6 +37,7 @@ linter: - prefer_final_fields - prefer_relative_imports - prefer_single_quotes + - simple_directive_paths - simplify_variable_pattern - sort_unnamed_constructors_first - specify_nonobvious_property_types diff --git a/examples/animation/animate0/pubspec.yaml b/examples/animation/animate0/pubspec.yaml index c7bd2694c8..7d9cfea0d7 100644 --- a/examples/animation/animate0/pubspec.yaml +++ b/examples/animation/animate0/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/animation/animate1/pubspec.yaml b/examples/animation/animate1/pubspec.yaml index 026e6dde10..c78a25b317 100644 --- a/examples/animation/animate1/pubspec.yaml +++ b/examples/animation/animate1/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/animation/animate2/pubspec.yaml b/examples/animation/animate2/pubspec.yaml index 2c85add160..aed1bd0823 100644 --- a/examples/animation/animate2/pubspec.yaml +++ b/examples/animation/animate2/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/animation/animate3/pubspec.yaml b/examples/animation/animate3/pubspec.yaml index 99639d6afb..450cc9bbe2 100644 --- a/examples/animation/animate3/pubspec.yaml +++ b/examples/animation/animate3/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/animation/animate4/pubspec.yaml b/examples/animation/animate4/pubspec.yaml index add514f1ff..b7f752d81d 100644 --- a/examples/animation/animate4/pubspec.yaml +++ b/examples/animation/animate4/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/animation/animate5/pubspec.yaml b/examples/animation/animate5/pubspec.yaml index b5aa9b8e78..ecaf770cc0 100644 --- a/examples/animation/animate5/pubspec.yaml +++ b/examples/animation/animate5/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/command/pubspec.yaml b/examples/app-architecture/command/pubspec.yaml index 9d3625d102..e0ff955350 100644 --- a/examples/app-architecture/command/pubspec.yaml +++ b/examples/app-architecture/command/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for command cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart b/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart index b0ae409cdc..dfc6f8e940 100644 --- a/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart +++ b/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart @@ -6,10 +6,9 @@ import '../services/database_service.dart'; class UserProfileRepository { UserProfileRepository({ - required ApiClientService apiClientService, - required DatabaseService databaseService, - }) : _apiClientService = apiClientService, - _databaseService = databaseService { + required this._apiClientService, + required this._databaseService, + }) { // #docregion Timer Timer.periodic(const Duration(minutes: 5), (timer) => sync()); // #enddocregion Timer diff --git a/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart b/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart index 6a96c891bf..6ec62646d5 100644 --- a/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart +++ b/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart @@ -5,8 +5,7 @@ import '../../domain/model/user_profile.dart'; // #docregion UserProfileViewModel class UserProfileViewModel extends ChangeNotifier { // #enddocregion UserProfileViewModel - UserProfileViewModel({required UserProfileRepository userProfileRepository}) - : _userProfileRepository = userProfileRepository { + UserProfileViewModel({required this._userProfileRepository}) { load(); } diff --git a/examples/app-architecture/offline_first/pubspec.yaml b/examples/app-architecture/offline_first/pubspec.yaml index 1042384780..5be1c19f1a 100644 --- a/examples/app-architecture/offline_first/pubspec.yaml +++ b/examples/app-architecture/offline_first/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for offline_first cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/optimistic_state/pubspec.yaml b/examples/app-architecture/optimistic_state/pubspec.yaml index 0bbe011daf..576b5eb80e 100644 --- a/examples/app-architecture/optimistic_state/pubspec.yaml +++ b/examples/app-architecture/optimistic_state/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for optimistic_state cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/result/pubspec.yaml b/examples/app-architecture/result/pubspec.yaml index 5357989125..22490b9a90 100644 --- a/examples/app-architecture/result/pubspec.yaml +++ b/examples/app-architecture/result/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for result cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart b/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart index d66a80fb2d..d836daa205 100644 --- a/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart +++ b/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart @@ -4,7 +4,7 @@ import '../services/database_service.dart'; // #docregion TodoRepository class TodoRepository { - TodoRepository({required DatabaseService database}) : _database = database; + TodoRepository({required this._database}); final DatabaseService _database; diff --git a/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart b/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart index c7ed7c8161..e76dd81d99 100644 --- a/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart +++ b/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart @@ -6,8 +6,7 @@ import '../../../utils/command.dart'; import '../../../utils/result.dart'; class TodoListViewModel extends ChangeNotifier { - TodoListViewModel({required TodoRepository todoRepository}) - : _todoRepository = todoRepository { + TodoListViewModel({required this._todoRepository}) { load = Command0(_load)..execute(); add = Command1(_add); delete = Command1(_delete); diff --git a/examples/app-architecture/todo_data_service/pubspec.yaml b/examples/app-architecture/todo_data_service/pubspec.yaml index d20f780132..b399211c30 100644 --- a/examples/app-architecture/todo_data_service/pubspec.yaml +++ b/examples/app-architecture/todo_data_service/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for key_value_data cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/animation/animated_container/pubspec.yaml b/examples/cookbook/animation/animated_container/pubspec.yaml index f43c4febd7..7e86ba1357 100644 --- a/examples/cookbook/animation/animated_container/pubspec.yaml +++ b/examples/cookbook/animation/animated_container/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/animation/opacity_animation/pubspec.yaml b/examples/cookbook/animation/opacity_animation/pubspec.yaml index ae343964a5..d265804e55 100644 --- a/examples/cookbook/animation/opacity_animation/pubspec.yaml +++ b/examples/cookbook/animation/opacity_animation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/animation/page_route_animation/pubspec.yaml b/examples/cookbook/animation/page_route_animation/pubspec.yaml index 647f1aefe8..532d9a75f7 100644 --- a/examples/cookbook/animation/page_route_animation/pubspec.yaml +++ b/examples/cookbook/animation/page_route_animation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/animation/physics_simulation/pubspec.yaml b/examples/cookbook/animation/physics_simulation/pubspec.yaml index 3355fc0989..a6e728cdd8 100644 --- a/examples/cookbook/animation/physics_simulation/pubspec.yaml +++ b/examples/cookbook/animation/physics_simulation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/cupertino_sheets/pubspec.yaml b/examples/cookbook/design/cupertino_sheets/pubspec.yaml index 8b957bbf00..73ea2fa241 100644 --- a/examples/cookbook/design/cupertino_sheets/pubspec.yaml +++ b/examples/cookbook/design/cupertino_sheets/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cupertino sheets cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/drawer/pubspec.yaml b/examples/cookbook/design/drawer/pubspec.yaml index 11b935bdb4..6bd1dc6d21 100644 --- a/examples/cookbook/design/drawer/pubspec.yaml +++ b/examples/cookbook/design/drawer/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for drawer cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/fonts/pubspec.yaml b/examples/cookbook/design/fonts/pubspec.yaml index d329b5580c..e4bcf7c63b 100644 --- a/examples/cookbook/design/fonts/pubspec.yaml +++ b/examples/cookbook/design/fonts/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/orientation/pubspec.yaml b/examples/cookbook/design/orientation/pubspec.yaml index b7c0810548..e79dfa7477 100644 --- a/examples/cookbook/design/orientation/pubspec.yaml +++ b/examples/cookbook/design/orientation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for orientation cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/package_fonts/pubspec.yaml b/examples/cookbook/design/package_fonts/pubspec.yaml index 750cb218bd..79b70f8258 100644 --- a/examples/cookbook/design/package_fonts/pubspec.yaml +++ b/examples/cookbook/design/package_fonts/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/snackbars/pubspec.yaml b/examples/cookbook/design/snackbars/pubspec.yaml index 049b7568ca..ecdbd12849 100644 --- a/examples/cookbook/design/snackbars/pubspec.yaml +++ b/examples/cookbook/design/snackbars/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for snackbars cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/tabs/pubspec.yaml b/examples/cookbook/design/tabs/pubspec.yaml index dd805ef130..8872dda7f7 100644 --- a/examples/cookbook/design/tabs/pubspec.yaml +++ b/examples/cookbook/design/tabs/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for tabs cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/themes/pubspec.yaml b/examples/cookbook/design/themes/pubspec.yaml index 1aae8bf2e8..6b7747dcd5 100644 --- a/examples/cookbook/design/themes/pubspec.yaml +++ b/examples/cookbook/design/themes/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for themes cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/effects/download_button/lib/main.dart b/examples/cookbook/effects/download_button/lib/main.dart index d8a1bec416..a22876e272 100644 --- a/examples/cookbook/effects/download_button/lib/main.dart +++ b/examples/cookbook/effects/download_button/lib/main.dart @@ -130,12 +130,10 @@ abstract class DownloadController implements ChangeNotifier { class SimulatedDownloadController extends DownloadController with ChangeNotifier { SimulatedDownloadController({ - DownloadStatus downloadStatus = DownloadStatus.notDownloaded, - double progress = 0.0, - required VoidCallback onOpenDownload, - }) : _downloadStatus = downloadStatus, - _progress = progress, - _onOpenDownload = onOpenDownload; + this._downloadStatus = DownloadStatus.notDownloaded, + this._progress = 0.0, + required this._onOpenDownload, + }); DownloadStatus _downloadStatus; @override diff --git a/examples/cookbook/effects/download_button/pubspec.yaml b/examples/cookbook/effects/download_button/pubspec.yaml index 5d1a3aff6f..416c8cfcab 100644 --- a/examples/cookbook/effects/download_button/pubspec.yaml +++ b/examples/cookbook/effects/download_button/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/effects/drag_a_widget/pubspec.yaml b/examples/cookbook/effects/drag_a_widget/pubspec.yaml index 401a966e75..26a91cc030 100644 --- a/examples/cookbook/effects/drag_a_widget/pubspec.yaml +++ b/examples/cookbook/effects/drag_a_widget/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/effects/expandable_fab/pubspec.yaml b/examples/cookbook/effects/expandable_fab/pubspec.yaml index 7963d1092f..475ec92125 100644 --- a/examples/cookbook/effects/expandable_fab/pubspec.yaml +++ b/examples/cookbook/effects/expandable_fab/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/effects/nested_nav/pubspec.yaml b/examples/cookbook/effects/nested_nav/pubspec.yaml index fe6c2cd61d..7a3f5d7aa5 100644 --- a/examples/cookbook/effects/nested_nav/pubspec.yaml +++ b/examples/cookbook/effects/nested_nav/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/effects/parallax_scrolling/lib/main.dart b/examples/cookbook/effects/parallax_scrolling/lib/main.dart index 7b318f5b77..f523039ff6 100644 --- a/examples/cookbook/effects/parallax_scrolling/lib/main.dart +++ b/examples/cookbook/effects/parallax_scrolling/lib/main.dart @@ -223,8 +223,7 @@ class ParallaxParentData extends ContainerBoxParentData {} class RenderParallax extends RenderBox with RenderObjectWithChildMixin, RenderProxyBoxMixin { - RenderParallax({required ScrollableState scrollable}) - : _scrollable = scrollable; + RenderParallax({required this._scrollable}); ScrollableState _scrollable; diff --git a/examples/cookbook/effects/parallax_scrolling/pubspec.yaml b/examples/cookbook/effects/parallax_scrolling/pubspec.yaml index 3d8b960b57..d064c4a136 100644 --- a/examples/cookbook/effects/parallax_scrolling/pubspec.yaml +++ b/examples/cookbook/effects/parallax_scrolling/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/effects/shimmer_loading/pubspec.yaml b/examples/cookbook/effects/shimmer_loading/pubspec.yaml index 601103143c..ae7f9f12f8 100644 --- a/examples/cookbook/effects/shimmer_loading/pubspec.yaml +++ b/examples/cookbook/effects/shimmer_loading/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml b/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml index 5efea85222..d1970aac2a 100644 --- a/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml +++ b/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/focus/pubspec.yaml b/examples/cookbook/forms/focus/pubspec.yaml index 1ad5e388e0..e5ceceded7 100644 --- a/examples/cookbook/forms/focus/pubspec.yaml +++ b/examples/cookbook/forms/focus/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for focus cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/retrieve_input/pubspec.yaml b/examples/cookbook/forms/retrieve_input/pubspec.yaml index baf3ca5866..9dde2284c6 100644 --- a/examples/cookbook/forms/retrieve_input/pubspec.yaml +++ b/examples/cookbook/forms/retrieve_input/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for retrieve_input cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/text_field_changes/pubspec.yaml b/examples/cookbook/forms/text_field_changes/pubspec.yaml index efb7cc39fd..9566630d5e 100644 --- a/examples/cookbook/forms/text_field_changes/pubspec.yaml +++ b/examples/cookbook/forms/text_field_changes/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for text_field_changes resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/text_input/pubspec.yaml b/examples/cookbook/forms/text_input/pubspec.yaml index ef20a53503..92f3dc28b9 100644 --- a/examples/cookbook/forms/text_input/pubspec.yaml +++ b/examples/cookbook/forms/text_input/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/validation/pubspec.yaml b/examples/cookbook/forms/validation/pubspec.yaml index 70b41e7748..b92ec8943b 100644 --- a/examples/cookbook/forms/validation/pubspec.yaml +++ b/examples/cookbook/forms/validation/pubspec.yaml @@ -3,7 +3,7 @@ description: Use Form widget to perform form validation. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/games/achievements_leaderboards/pubspec.yaml b/examples/cookbook/games/achievements_leaderboards/pubspec.yaml index bd37990e9b..cdc85a2052 100644 --- a/examples/cookbook/games/achievements_leaderboards/pubspec.yaml +++ b/examples/cookbook/games/achievements_leaderboards/pubspec.yaml @@ -3,7 +3,7 @@ description: Games services resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/games/firestore_multiplayer/pubspec.yaml b/examples/cookbook/games/firestore_multiplayer/pubspec.yaml index 0ab6675f30..82d69d3759 100644 --- a/examples/cookbook/games/firestore_multiplayer/pubspec.yaml +++ b/examples/cookbook/games/firestore_multiplayer/pubspec.yaml @@ -3,7 +3,7 @@ description: Firestore multiplayer resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/gestures/dismissible/pubspec.yaml b/examples/cookbook/gestures/dismissible/pubspec.yaml index 378e6d9658..2cee70eb0b 100644 --- a/examples/cookbook/gestures/dismissible/pubspec.yaml +++ b/examples/cookbook/gestures/dismissible/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for dismissible cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/gestures/handling_taps/pubspec.yaml b/examples/cookbook/gestures/handling_taps/pubspec.yaml index 95eaa9232f..d3e4c32ecf 100644 --- a/examples/cookbook/gestures/handling_taps/pubspec.yaml +++ b/examples/cookbook/gestures/handling_taps/pubspec.yaml @@ -3,7 +3,7 @@ description: Example on handling_taps cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/gestures/ripples/pubspec.yaml b/examples/cookbook/gestures/ripples/pubspec.yaml index a82c2f06ed..0e996979d6 100644 --- a/examples/cookbook/gestures/ripples/pubspec.yaml +++ b/examples/cookbook/gestures/ripples/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for ripples cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/images/cached_images/pubspec.yaml b/examples/cookbook/images/cached_images/pubspec.yaml index a092e575bc..6423b6a2ba 100644 --- a/examples/cookbook/images/cached_images/pubspec.yaml +++ b/examples/cookbook/images/cached_images/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/images/fading_in_images/pubspec.yaml b/examples/cookbook/images/fading_in_images/pubspec.yaml index 3011f28a21..8c57d526ac 100644 --- a/examples/cookbook/images/fading_in_images/pubspec.yaml +++ b/examples/cookbook/images/fading_in_images/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/images/network_image/pubspec.yaml b/examples/cookbook/images/network_image/pubspec.yaml index f3a207ebc9..cfbe13d582 100644 --- a/examples/cookbook/images/network_image/pubspec.yaml +++ b/examples/cookbook/images/network_image/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/basic_list/pubspec.yaml b/examples/cookbook/lists/basic_list/pubspec.yaml index 0620ad3b5b..5f6461b8a7 100644 --- a/examples/cookbook/lists/basic_list/pubspec.yaml +++ b/examples/cookbook/lists/basic_list/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/floating_app_bar/pubspec.yaml b/examples/cookbook/lists/floating_app_bar/pubspec.yaml index d297055c43..da693b8611 100644 --- a/examples/cookbook/lists/floating_app_bar/pubspec.yaml +++ b/examples/cookbook/lists/floating_app_bar/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for floating_app_bar cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/grid_lists/pubspec.yaml b/examples/cookbook/lists/grid_lists/pubspec.yaml index 35a02544f3..372fbd1466 100644 --- a/examples/cookbook/lists/grid_lists/pubspec.yaml +++ b/examples/cookbook/lists/grid_lists/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/horizontal_list/pubspec.yaml b/examples/cookbook/lists/horizontal_list/pubspec.yaml index be94a25b14..d23114b631 100644 --- a/examples/cookbook/lists/horizontal_list/pubspec.yaml +++ b/examples/cookbook/lists/horizontal_list/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/long_lists/pubspec.yaml b/examples/cookbook/lists/long_lists/pubspec.yaml index 63957af6bb..75b7dfb829 100644 --- a/examples/cookbook/lists/long_lists/pubspec.yaml +++ b/examples/cookbook/lists/long_lists/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for long_lists cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/mixed_list/pubspec.yaml b/examples/cookbook/lists/mixed_list/pubspec.yaml index d7b17f2772..67ffd18e1b 100644 --- a/examples/cookbook/lists/mixed_list/pubspec.yaml +++ b/examples/cookbook/lists/mixed_list/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for mixed_lists cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/spaced_items/pubspec.yaml b/examples/cookbook/lists/spaced_items/pubspec.yaml index fc02c27a95..4086f0dc97 100644 --- a/examples/cookbook/lists/spaced_items/pubspec.yaml +++ b/examples/cookbook/lists/spaced_items/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for spaced_items cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/maintenance/error_reporting/pubspec.yaml b/examples/cookbook/maintenance/error_reporting/pubspec.yaml index 5a84312410..b89db58467 100644 --- a/examples/cookbook/maintenance/error_reporting/pubspec.yaml +++ b/examples/cookbook/maintenance/error_reporting/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/hero_animations/pubspec.yaml b/examples/cookbook/navigation/hero_animations/pubspec.yaml index 8871b0abf0..ad0c36178e 100644 --- a/examples/cookbook/navigation/hero_animations/pubspec.yaml +++ b/examples/cookbook/navigation/hero_animations/pubspec.yaml @@ -3,7 +3,7 @@ description: Hero animations resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/named_routes/pubspec.yaml b/examples/cookbook/navigation/named_routes/pubspec.yaml index 37f509b98a..1aa58c3223 100644 --- a/examples/cookbook/navigation/named_routes/pubspec.yaml +++ b/examples/cookbook/navigation/named_routes/pubspec.yaml @@ -3,7 +3,7 @@ description: Named route example snippets. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml b/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml index d4cf141d03..ef19dcc7b8 100644 --- a/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml +++ b/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml @@ -3,7 +3,7 @@ description: Use Form widget to perform form validation. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/navigation_basics/pubspec.yaml b/examples/cookbook/navigation/navigation_basics/pubspec.yaml index ba4cd9fef0..e3428bb59b 100644 --- a/examples/cookbook/navigation/navigation_basics/pubspec.yaml +++ b/examples/cookbook/navigation/navigation_basics/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/passing_data/pubspec.yaml b/examples/cookbook/navigation/passing_data/pubspec.yaml index 1018d69883..697a87ed8a 100644 --- a/examples/cookbook/navigation/passing_data/pubspec.yaml +++ b/examples/cookbook/navigation/passing_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Passing data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/returning_data/pubspec.yaml b/examples/cookbook/navigation/returning_data/pubspec.yaml index 2801c4ef58..c00e4df488 100644 --- a/examples/cookbook/navigation/returning_data/pubspec.yaml +++ b/examples/cookbook/navigation/returning_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Returning data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/authenticated_requests/pubspec.yaml b/examples/cookbook/networking/authenticated_requests/pubspec.yaml index 374a94f401..dd2bb81003 100644 --- a/examples/cookbook/networking/authenticated_requests/pubspec.yaml +++ b/examples/cookbook/networking/authenticated_requests/pubspec.yaml @@ -3,7 +3,7 @@ description: Authenticated HTTP request example snippets. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/background_parsing/pubspec.yaml b/examples/cookbook/networking/background_parsing/pubspec.yaml index eea62c3f94..4894893d7f 100644 --- a/examples/cookbook/networking/background_parsing/pubspec.yaml +++ b/examples/cookbook/networking/background_parsing/pubspec.yaml @@ -3,7 +3,7 @@ description: Background parsing resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/delete_data/pubspec.yaml b/examples/cookbook/networking/delete_data/pubspec.yaml index 44776f17d3..210e738ee4 100644 --- a/examples/cookbook/networking/delete_data/pubspec.yaml +++ b/examples/cookbook/networking/delete_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Delete Data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/fetch_data/pubspec.yaml b/examples/cookbook/networking/fetch_data/pubspec.yaml index 25493bff61..70d3e803be 100644 --- a/examples/cookbook/networking/fetch_data/pubspec.yaml +++ b/examples/cookbook/networking/fetch_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Fetch Data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/send_data/pubspec.yaml b/examples/cookbook/networking/send_data/pubspec.yaml index 4272b5efe1..ce34ba4aa4 100644 --- a/examples/cookbook/networking/send_data/pubspec.yaml +++ b/examples/cookbook/networking/send_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Send data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/update_data/pubspec.yaml b/examples/cookbook/networking/update_data/pubspec.yaml index fc33f66c24..a5c81800de 100644 --- a/examples/cookbook/networking/update_data/pubspec.yaml +++ b/examples/cookbook/networking/update_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Update Data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/web_sockets/pubspec.yaml b/examples/cookbook/networking/web_sockets/pubspec.yaml index 560d1ff952..0d6fbcff57 100644 --- a/examples/cookbook/networking/web_sockets/pubspec.yaml +++ b/examples/cookbook/networking/web_sockets/pubspec.yaml @@ -3,7 +3,7 @@ description: Web Sockets resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/persistence/key_value/pubspec.yaml b/examples/cookbook/persistence/key_value/pubspec.yaml index 0af68667a0..5f5e6f754a 100644 --- a/examples/cookbook/persistence/key_value/pubspec.yaml +++ b/examples/cookbook/persistence/key_value/pubspec.yaml @@ -6,7 +6,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/persistence/reading_writing_files/pubspec.yaml b/examples/cookbook/persistence/reading_writing_files/pubspec.yaml index 27d994ee97..cce71675ec 100644 --- a/examples/cookbook/persistence/reading_writing_files/pubspec.yaml +++ b/examples/cookbook/persistence/reading_writing_files/pubspec.yaml @@ -3,7 +3,7 @@ description: Reading and Writing Files resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/persistence/sqlite/pubspec.yaml b/examples/cookbook/persistence/sqlite/pubspec.yaml index 5f450f1135..6b6240f741 100644 --- a/examples/cookbook/persistence/sqlite/pubspec.yaml +++ b/examples/cookbook/persistence/sqlite/pubspec.yaml @@ -3,7 +3,7 @@ description: Example of using sqflite plugin to access SQLite database. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml b/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml index 8e46d6236e..6db3d9051c 100644 --- a/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml +++ b/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml @@ -3,7 +3,7 @@ description: Google mobile ads resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/plugins/picture_using_camera/pubspec.yaml b/examples/cookbook/plugins/picture_using_camera/pubspec.yaml index 7f217a355e..28fcebf2ef 100644 --- a/examples/cookbook/plugins/picture_using_camera/pubspec.yaml +++ b/examples/cookbook/plugins/picture_using_camera/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/plugins/play_video/pubspec.yaml b/examples/cookbook/plugins/play_video/pubspec.yaml index 525487a2d5..99955fa499 100644 --- a/examples/cookbook/plugins/play_video/pubspec.yaml +++ b/examples/cookbook/plugins/play_video/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/integration/introduction/pubspec.yaml b/examples/cookbook/testing/integration/introduction/pubspec.yaml index 6c2ef6efbb..f19bbc05da 100644 --- a/examples/cookbook/testing/integration/introduction/pubspec.yaml +++ b/examples/cookbook/testing/integration/introduction/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/integration/profiling/pubspec.yaml b/examples/cookbook/testing/integration/profiling/pubspec.yaml index 3117c9620c..f9171d89a0 100644 --- a/examples/cookbook/testing/integration/profiling/pubspec.yaml +++ b/examples/cookbook/testing/integration/profiling/pubspec.yaml @@ -3,7 +3,7 @@ description: Integration test profiling examples. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/unit/counter_app/pubspec.yaml b/examples/cookbook/testing/unit/counter_app/pubspec.yaml index 00cfb02445..a2ca8a4e70 100644 --- a/examples/cookbook/testing/unit/counter_app/pubspec.yaml +++ b/examples/cookbook/testing/unit/counter_app/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/unit/mocking/pubspec.yaml b/examples/cookbook/testing/unit/mocking/pubspec.yaml index 1df7c0a0ba..add5eec47d 100644 --- a/examples/cookbook/testing/unit/mocking/pubspec.yaml +++ b/examples/cookbook/testing/unit/mocking/pubspec.yaml @@ -3,7 +3,7 @@ description: Use the Mockito package to mimic the behavior of services for testi resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/finders/pubspec.yaml b/examples/cookbook/testing/widget/finders/pubspec.yaml index 463e61ce66..e687327c0a 100644 --- a/examples/cookbook/testing/widget/finders/pubspec.yaml +++ b/examples/cookbook/testing/widget/finders/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/introduction/pubspec.yaml b/examples/cookbook/testing/widget/introduction/pubspec.yaml index d5d3c4ecd0..e5091fb3ae 100644 --- a/examples/cookbook/testing/widget/introduction/pubspec.yaml +++ b/examples/cookbook/testing/widget/introduction/pubspec.yaml @@ -3,7 +3,7 @@ description: Widget testing example snippets. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml b/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml index 6f873bd68d..6e0d01f487 100644 --- a/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml +++ b/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/scrolling/pubspec.yaml b/examples/cookbook/testing/widget/scrolling/pubspec.yaml index e5df2a0574..c5f706bbf0 100644 --- a/examples/cookbook/testing/widget/scrolling/pubspec.yaml +++ b/examples/cookbook/testing/widget/scrolling/pubspec.yaml @@ -3,7 +3,7 @@ description: Scrollable widget testing. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/tap_drag/pubspec.yaml b/examples/cookbook/testing/widget/tap_drag/pubspec.yaml index 0ae2f1e6ad..eba8d8f068 100644 --- a/examples/cookbook/testing/widget/tap_drag/pubspec.yaml +++ b/examples/cookbook/testing/widget/tap_drag/pubspec.yaml @@ -3,7 +3,7 @@ description: Tap drag widget testing examples. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/data-and-backend/json/pubspec.yaml b/examples/data-and-backend/json/pubspec.yaml index dadd5faedb..33fd38410b 100644 --- a/examples/data-and-backend/json/pubspec.yaml +++ b/examples/data-and-backend/json/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: json_annotation: ^4.9.0 diff --git a/examples/deployment/obfuscate/pubspec.yaml b/examples/deployment/obfuscate/pubspec.yaml index 2eaa2f5b5a..dd2624c1bc 100644 --- a/examples/deployment/obfuscate/pubspec.yaml +++ b/examples/deployment/obfuscate/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/fwe/birdle/pubspec.yaml b/examples/fwe/birdle/pubspec.yaml index 09999ff4de..d2bebbbc06 100644 --- a/examples/fwe/birdle/pubspec.yaml +++ b/examples/fwe/birdle/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/fwe/rolodex/pubspec.yaml b/examples/fwe/rolodex/pubspec.yaml index f3d3493932..016bf47e1e 100644 --- a/examples/fwe/rolodex/pubspec.yaml +++ b/examples/fwe/rolodex/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/fwe/wikipedia_reader/pubspec.yaml b/examples/fwe/wikipedia_reader/pubspec.yaml index 3910df1240..30ee9cca22 100644 --- a/examples/fwe/wikipedia_reader/pubspec.yaml +++ b/examples/fwe/wikipedia_reader/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/get-started/flutter-for/android_devs/pubspec.yaml b/examples/get-started/flutter-for/android_devs/pubspec.yaml index d7571df761..5231c574c7 100644 --- a/examples/get-started/flutter-for/android_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/android_devs/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/get-started/flutter-for/declarative/pubspec.yaml b/examples/get-started/flutter-for/declarative/pubspec.yaml index 426207fca2..2a877d5296 100644 --- a/examples/get-started/flutter-for/declarative/pubspec.yaml +++ b/examples/get-started/flutter-for/declarative/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/get-started/flutter-for/ios_devs/pubspec.yaml b/examples/get-started/flutter-for/ios_devs/pubspec.yaml index ff56336dac..2ee9cfde83 100644 --- a/examples/get-started/flutter-for/ios_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/ios_devs/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml b/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml index 2f17ed340a..8e22875a2f 100644 --- a/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml +++ b/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml @@ -4,4 +4,4 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 diff --git a/examples/get-started/flutter-for/react_native_devs/pubspec.yaml b/examples/get-started/flutter-for/react_native_devs/pubspec.yaml index 40e12dcbcd..50646cd015 100644 --- a/examples/get-started/flutter-for/react_native_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/react_native_devs/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 workspace: - my_widgets diff --git a/examples/get-started/flutter-for/web_devs/pubspec.yaml b/examples/get-started/flutter-for/web_devs/pubspec.yaml index ecf0bcaa1c..8984161410 100644 --- a/examples/get-started/flutter-for/web_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/web_devs/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml b/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml index bf0c113be1..a24b53af4d 100644 --- a/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/googleapis/pubspec.yaml b/examples/googleapis/pubspec.yaml index 035d0e01c3..25e5f3bfc9 100644 --- a/examples/googleapis/pubspec.yaml +++ b/examples/googleapis/pubspec.yaml @@ -3,7 +3,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: collection: any # Pull the version of package:collection from Flutter. diff --git a/examples/integration_test/pubspec.yaml b/examples/integration_test/pubspec.yaml index d6156628b4..bd96d3e836 100644 --- a/examples/integration_test/pubspec.yaml +++ b/examples/integration_test/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/integration_test_migration/pubspec.yaml b/examples/integration_test_migration/pubspec.yaml index 6015641ad9..33ceb0759c 100644 --- a/examples/integration_test_migration/pubspec.yaml +++ b/examples/integration_test_migration/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/internationalization/add_language/pubspec.yaml b/examples/internationalization/add_language/pubspec.yaml index 0243772c46..f323ca8021 100644 --- a/examples/internationalization/add_language/pubspec.yaml +++ b/examples/internationalization/add_language/pubspec.yaml @@ -3,7 +3,7 @@ description: An i18n app example that adds a supported language resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/internationalization/gen_l10n_example/pubspec.yaml b/examples/internationalization/gen_l10n_example/pubspec.yaml index f30b1e4d4a..af3ec816f9 100644 --- a/examples/internationalization/gen_l10n_example/pubspec.yaml +++ b/examples/internationalization/gen_l10n_example/pubspec.yaml @@ -5,7 +5,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 # #docregion flutter-localizations dependencies: diff --git a/examples/internationalization/intl_example/pubspec.yaml b/examples/internationalization/intl_example/pubspec.yaml index c267678a67..d4d93df67b 100644 --- a/examples/internationalization/intl_example/pubspec.yaml +++ b/examples/internationalization/intl_example/pubspec.yaml @@ -3,7 +3,7 @@ description: Example of a Flutter app using the intl library services. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/internationalization/minimal/pubspec.yaml b/examples/internationalization/minimal/pubspec.yaml index eb845ff4f2..92814c098a 100644 --- a/examples/internationalization/minimal/pubspec.yaml +++ b/examples/internationalization/minimal/pubspec.yaml @@ -3,7 +3,7 @@ description: A minimal example of a localized Flutter app resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/base/pubspec.yaml b/examples/layout/base/pubspec.yaml index e430dad6b4..d39f9b1e90 100644 --- a/examples/layout/base/pubspec.yaml +++ b/examples/layout/base/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/card_and_stack/pubspec.yaml b/examples/layout/card_and_stack/pubspec.yaml index f855ee91cd..a3349e3d50 100644 --- a/examples/layout/card_and_stack/pubspec.yaml +++ b/examples/layout/card_and_stack/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/constraints/pubspec.yaml b/examples/layout/constraints/pubspec.yaml index 6df5d7b51a..1458d69ed8 100644 --- a/examples/layout/constraints/pubspec.yaml +++ b/examples/layout/constraints/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/container/pubspec.yaml b/examples/layout/container/pubspec.yaml index e7eaa85278..6440de723f 100644 --- a/examples/layout/container/pubspec.yaml +++ b/examples/layout/container/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/gallery/pubspec.yaml b/examples/layout/gallery/pubspec.yaml index 5e63b7e161..8ef432185e 100644 --- a/examples/layout/gallery/pubspec.yaml +++ b/examples/layout/gallery/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: animations: ^2.0.11 diff --git a/examples/layout/grid_and_list/pubspec.yaml b/examples/layout/grid_and_list/pubspec.yaml index 8e0179ee44..188cb3a779 100644 --- a/examples/layout/grid_and_list/pubspec.yaml +++ b/examples/layout/grid_and_list/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/lakes/interactive/pubspec.yaml b/examples/layout/lakes/interactive/pubspec.yaml index 989669353a..4e64643af2 100644 --- a/examples/layout/lakes/interactive/pubspec.yaml +++ b/examples/layout/lakes/interactive/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/lakes/step2/pubspec.yaml b/examples/layout/lakes/step2/pubspec.yaml index ac5bdd470a..9be1dba502 100644 --- a/examples/layout/lakes/step2/pubspec.yaml +++ b/examples/layout/lakes/step2/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/lakes/step3/pubspec.yaml b/examples/layout/lakes/step3/pubspec.yaml index 0f6d17dded..0667a946fd 100644 --- a/examples/layout/lakes/step3/pubspec.yaml +++ b/examples/layout/lakes/step3/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/lakes/step4/pubspec.yaml b/examples/layout/lakes/step4/pubspec.yaml index d331ae3b05..fa5a954216 100644 --- a/examples/layout/lakes/step4/pubspec.yaml +++ b/examples/layout/lakes/step4/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/lakes/step5/pubspec.yaml b/examples/layout/lakes/step5/pubspec.yaml index ce0445c4af..9e03d0d8b3 100644 --- a/examples/layout/lakes/step5/pubspec.yaml +++ b/examples/layout/lakes/step5/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/lakes/step6/pubspec.yaml b/examples/layout/lakes/step6/pubspec.yaml index 930535164b..82c98a1c1e 100644 --- a/examples/layout/lakes/step6/pubspec.yaml +++ b/examples/layout/lakes/step6/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/non_material/pubspec.yaml b/examples/layout/non_material/pubspec.yaml index 76d2b91d09..3fa2a4b221 100644 --- a/examples/layout/non_material/pubspec.yaml +++ b/examples/layout/non_material/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/pavlova/pubspec.yaml b/examples/layout/pavlova/pubspec.yaml index e968a1a306..291c2879ac 100644 --- a/examples/layout/pavlova/pubspec.yaml +++ b/examples/layout/pavlova/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/row_column/pubspec.yaml b/examples/layout/row_column/pubspec.yaml index 97630e1095..1c0023aaf5 100644 --- a/examples/layout/row_column/pubspec.yaml +++ b/examples/layout/row_column/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/sizing/pubspec.yaml b/examples/layout/sizing/pubspec.yaml index 490a2aae36..5e3645dc37 100644 --- a/examples/layout/sizing/pubspec.yaml +++ b/examples/layout/sizing/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/perf/concurrency/isolates/pubspec.yaml b/examples/perf/concurrency/isolates/pubspec.yaml index 1765394076..eb187c172a 100644 --- a/examples/perf/concurrency/isolates/pubspec.yaml +++ b/examples/perf/concurrency/isolates/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/perf/deferred_components/pubspec.yaml b/examples/perf/deferred_components/pubspec.yaml index 086db23498..03887415ab 100644 --- a/examples/perf/deferred_components/pubspec.yaml +++ b/examples/perf/deferred_components/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/compose_activities/pubspec.yaml b/examples/platform_integration/compose_activities/pubspec.yaml index eff123fc1c..af13b81e6e 100644 --- a/examples/platform_integration/compose_activities/pubspec.yaml +++ b/examples/platform_integration/compose_activities/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/pigeon/pubspec.yaml b/examples/platform_integration/pigeon/pubspec.yaml index 61bb624e33..30d2215a9a 100644 --- a/examples/platform_integration/pigeon/pubspec.yaml +++ b/examples/platform_integration/pigeon/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/platform_channels/pubspec.yaml b/examples/platform_integration/platform_channels/pubspec.yaml index e6c350f14b..85f5f37306 100644 --- a/examples/platform_integration/platform_channels/pubspec.yaml +++ b/examples/platform_integration/platform_channels/pubspec.yaml @@ -9,7 +9,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/platform_views/pubspec.yaml b/examples/platform_integration/platform_views/pubspec.yaml index f697fca2e2..c37f5028c3 100644 --- a/examples/platform_integration/platform_views/pubspec.yaml +++ b/examples/platform_integration/platform_views/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/plugin_api_migration/pubspec.yaml b/examples/platform_integration/plugin_api_migration/pubspec.yaml index b7966e5253..b706b92d88 100644 --- a/examples/platform_integration/plugin_api_migration/pubspec.yaml +++ b/examples/platform_integration/plugin_api_migration/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/pubspec.yaml b/examples/pubspec.yaml index cb57c6b650..3c3dc5334e 100644 --- a/examples/pubspec.yaml +++ b/examples/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_docs_examples publish_to: none environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 workspace: - _animation/basic_hero_animation diff --git a/examples/resources/architectural_overview/pubspec.yaml b/examples/resources/architectural_overview/pubspec.yaml index c598856dc0..9b91f570aa 100644 --- a/examples/resources/architectural_overview/pubspec.yaml +++ b/examples/resources/architectural_overview/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/resources/dart_swift_concurrency/pubspec.yaml b/examples/resources/dart_swift_concurrency/pubspec.yaml index 1f35a42ac3..000f248cc1 100644 --- a/examples/resources/dart_swift_concurrency/pubspec.yaml +++ b/examples/resources/dart_swift_concurrency/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/state_mgmt/simple/pubspec.yaml b/examples/state_mgmt/simple/pubspec.yaml index 294557d15a..de65b89166 100644 --- a/examples/state_mgmt/simple/pubspec.yaml +++ b/examples/state_mgmt/simple/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/code_debugging/pubspec.yaml b/examples/testing/code_debugging/pubspec.yaml index a834e893a8..1ba0443f87 100644 --- a/examples/testing/code_debugging/pubspec.yaml +++ b/examples/testing/code_debugging/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/common_errors/pubspec.yaml b/examples/testing/common_errors/pubspec.yaml index ef32a56a21..fc3f83df0c 100644 --- a/examples/testing/common_errors/pubspec.yaml +++ b/examples/testing/common_errors/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/errors/lib/excerpts.dart b/examples/testing/errors/lib/excerpts.dart index 98468ddb94..1487c3e7f9 100644 --- a/examples/testing/errors/lib/excerpts.dart +++ b/examples/testing/errors/lib/excerpts.dart @@ -1,6 +1,6 @@ // ignore_for_file: directives_ordering -import './backend.dart'; +import 'backend.dart'; import 'package:flutter/services.dart'; diff --git a/examples/testing/errors/lib/main.dart b/examples/testing/errors/lib/main.dart index 3b11a024da..2cc2ea82de 100644 --- a/examples/testing/errors/lib/main.dart +++ b/examples/testing/errors/lib/main.dart @@ -1,6 +1,6 @@ // ignore_for_file: directives_ordering -import './error_handler.dart'; +import 'error_handler.dart'; // #docregion all-errors import 'package:flutter/material.dart'; import 'dart:ui'; diff --git a/examples/testing/errors/lib/quit_immediate.dart b/examples/testing/errors/lib/quit_immediate.dart index 231093d198..e3da9751b5 100644 --- a/examples/testing/errors/lib/quit_immediate.dart +++ b/examples/testing/errors/lib/quit_immediate.dart @@ -1,6 +1,6 @@ // ignore_for_file: directives_ordering -import './my_app.dart'; +import 'my_app.dart'; // #docregion on-error-main import 'dart:io'; diff --git a/examples/testing/errors/pubspec.yaml b/examples/testing/errors/pubspec.yaml index 54cd00fc0f..619ddeaaae 100644 --- a/examples/testing/errors/pubspec.yaml +++ b/examples/testing/errors/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/integration_tests/how_to/pubspec.yaml b/examples/testing/integration_tests/how_to/pubspec.yaml index 61c34c4669..557ba3a9ba 100644 --- a/examples/testing/integration_tests/how_to/pubspec.yaml +++ b/examples/testing/integration_tests/how_to/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/native_debugging/pubspec.yaml b/examples/testing/native_debugging/pubspec.yaml index 6483cd8472..5343869dfe 100644 --- a/examples/testing/native_debugging/pubspec.yaml +++ b/examples/testing/native_debugging/pubspec.yaml @@ -5,7 +5,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/tools/pubspec.yaml b/examples/tools/pubspec.yaml index f448444407..e847e0e8c3 100644 --- a/examples/tools/pubspec.yaml +++ b/examples/tools/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/actions_and_shortcuts/pubspec.yaml b/examples/ui/actions_and_shortcuts/pubspec.yaml index e373510d40..05efe01e95 100644 --- a/examples/ui/actions_and_shortcuts/pubspec.yaml +++ b/examples/ui/actions_and_shortcuts/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/adaptive_app_demos/pubspec.yaml b/examples/ui/adaptive_app_demos/pubspec.yaml index 7a466a4e1d..fa03b2e129 100644 --- a/examples/ui/adaptive_app_demos/pubspec.yaml +++ b/examples/ui/adaptive_app_demos/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/assets_and_images/pubspec.yaml b/examples/ui/assets_and_images/pubspec.yaml index 31e8cc3542..b41396a6e1 100644 --- a/examples/ui/assets_and_images/pubspec.yaml +++ b/examples/ui/assets_and_images/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/focus/pubspec.yaml b/examples/ui/focus/pubspec.yaml index 2c13423351..a2cc7789f1 100644 --- a/examples/ui/focus/pubspec.yaml +++ b/examples/ui/focus/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/interactive/pubspec.yaml b/examples/ui/interactive/pubspec.yaml index 65d4a388d0..fc52dbc79e 100644 --- a/examples/ui/interactive/pubspec.yaml +++ b/examples/ui/interactive/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for interactive.md resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/navigation/pubspec.yaml b/examples/ui/navigation/pubspec.yaml index 442d5d683f..6c33618229 100644 --- a/examples/ui/navigation/pubspec.yaml +++ b/examples/ui/navigation/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/widgets_intro/pubspec.yaml b/examples/ui/widgets_intro/pubspec.yaml index 3fd65854b9..35c9b75433 100644 --- a/examples/ui/widgets_intro/pubspec.yaml +++ b/examples/ui/widgets_intro/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/visual_debugging/pubspec.yaml b/examples/visual_debugging/pubspec.yaml index 73c889985e..f124c4eed0 100644 --- a/examples/visual_debugging/pubspec.yaml +++ b/examples/visual_debugging/pubspec.yaml @@ -4,7 +4,7 @@ description: Examples of visual debugging. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/packages/analysis_defaults/pubspec.yaml b/packages/analysis_defaults/pubspec.yaml index bbf8f5f2e2..27177f7e1d 100644 --- a/packages/analysis_defaults/pubspec.yaml +++ b/packages/analysis_defaults/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 # NOTE: Code isn't allowed in this package. # Don't add dependencies besides the underlying lints package. diff --git a/packages/excerpter/pubspec.yaml b/packages/excerpter/pubspec.yaml index 9c4208deab..c4b58ccd69 100644 --- a/packages/excerpter/pubspec.yaml +++ b/packages/excerpter/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: args: ^2.6.0 diff --git a/pubspec.yaml b/pubspec.yaml index 22ccee33cb..a3d2f1b3e2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: >- publish_to: none environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 workspace: - packages/analysis_defaults diff --git a/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart b/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart index 6158fe4867..1aa7b0d3e8 100644 --- a/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart +++ b/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart @@ -27,12 +27,12 @@ final class EmbeddedDartPad extends StatefulComponent { final String code; /// Creates an embedded DartPad instance with - /// the specified [iframeId] and [iframeUrl]. + /// the specified [iframeId] and [_iframeUrl]. EmbeddedDartPad._({ required this.iframeId, - required String iframeUrl, + required this._iframeUrl, required this.code, - }) : _iframeUrl = iframeUrl; + }); /// Creates a new embedded DartPad element with the specified configuration. /// diff --git a/sites/docs/pubspec.yaml b/sites/docs/pubspec.yaml index 040d7ad96c..082ea54709 100644 --- a/sites/docs/pubspec.yaml +++ b/sites/docs/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://docs.flutter.dev resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: build: ^4.0.6 diff --git a/sites/docs/src/content/app-architecture/design-patterns/sql.md b/sites/docs/src/content/app-architecture/design-patterns/sql.md index 012d61a3de..f205946e62 100644 --- a/sites/docs/src/content/app-architecture/design-patterns/sql.md +++ b/sites/docs/src/content/app-architecture/design-patterns/sql.md @@ -277,7 +277,7 @@ It implements the `fetchTodos()`, `createTodo()`, and `deleteTodo()` methods. ```dart class TodoRepository { - TodoRepository({required DatabaseService database}) : _database = database; + TodoRepository({required this._database}); final DatabaseService _database; diff --git a/sites/docs/src/content/cookbook/effects/download-button.md b/sites/docs/src/content/cookbook/effects/download-button.md index f8e4a5c7ad..bc0354e614 100644 --- a/sites/docs/src/content/cookbook/effects/download-button.md +++ b/sites/docs/src/content/cookbook/effects/download-button.md @@ -593,12 +593,10 @@ abstract class DownloadController implements ChangeNotifier { class SimulatedDownloadController extends DownloadController with ChangeNotifier { SimulatedDownloadController({ - DownloadStatus downloadStatus = DownloadStatus.notDownloaded, - double progress = 0.0, - required VoidCallback onOpenDownload, - }) : _downloadStatus = downloadStatus, - _progress = progress, - _onOpenDownload = onOpenDownload; + this._downloadStatus = DownloadStatus.notDownloaded, + this._progress = 0.0, + required this._onOpenDownload, + }); DownloadStatus _downloadStatus; @override diff --git a/sites/docs/src/content/cookbook/effects/parallax-scrolling.md b/sites/docs/src/content/cookbook/effects/parallax-scrolling.md index 8a17ccda1c..49075e7a09 100644 --- a/sites/docs/src/content/cookbook/effects/parallax-scrolling.md +++ b/sites/docs/src/content/cookbook/effects/parallax-scrolling.md @@ -776,8 +776,7 @@ class ParallaxParentData extends ContainerBoxParentData {} class RenderParallax extends RenderBox with RenderObjectWithChildMixin, RenderProxyBoxMixin { - RenderParallax({required ScrollableState scrollable}) - : _scrollable = scrollable; + RenderParallax({required this._scrollable}); ScrollableState _scrollable; diff --git a/sites/docs/src/content/tools/pubspec.md b/sites/docs/src/content/tools/pubspec.md index 958827fccc..16f5c9aa37 100644 --- a/sites/docs/src/content/tools/pubspec.md +++ b/sites/docs/src/content/tools/pubspec.md @@ -63,7 +63,7 @@ publish_to: none version: 1.0.0+1 environment: - sdk: ^3.11.0 + sdk: ^3.12.0 dependencies: [!flutter:!] # Required for every Flutter project diff --git a/sites/docs/src/data/site.yml b/sites/docs/src/data/site.yml index f0b17a38e6..081f137008 100644 --- a/sites/docs/src/data/site.yml +++ b/sites/docs/src/data/site.yml @@ -58,7 +58,7 @@ yt: watch: 'https://www.youtube.com/watch' playlist: 'https://www.youtube.com/playlist?list=' -currentFlutterVersion: '3.41.5' +currentFlutterVersion: '3.44.0' # Settings for Jaspr. diff --git a/tool/dash_site/pubspec.yaml b/tool/dash_site/pubspec.yaml index 8ebe90d7d2..1907d314d1 100644 --- a/tool/dash_site/pubspec.yaml +++ b/tool/dash_site/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: args: ^2.7.0 From 9abbdd31386f3b117b3c0e9a79ae547b3f7cfb20 Mon Sep 17 00:00:00 2001 From: Victoria Ashworth <15619084+vashworth@users.noreply.github.com> Date: Mon, 18 May 2026 15:53:37 -0500 Subject: [PATCH 16/28] Add design doc for macos-intel-deprecation (#13398) Add `/go/macos-intel-deprecation` design doc redirect. --- firebase.json | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase.json b/firebase.json index ab84876564..fa4bb33399 100644 --- a/firebase.json +++ b/firebase.json @@ -594,6 +594,7 @@ { "source": "/go/lints-migration", "destination": "/release/breaking-changes/flutter-lints-package", "type": 301 }, { "source": "/go/localizing-datetime", "destination": "https://docs.google.com/document/d/1QR3qLXWdroTVLbnAQ8mq-Ia6tsZ8NY3lmi7gySQAstU/edit", "type": 301 }, { "source": "/go/mac-voiceover-text-editing", "destination": "https://docs.google.com/document/d/19YP1o4Shba6NzQTBH_EWC8y1GUhKAbo9dan4digFbZs", "type": 301 }, + { "source": "/go/macos-intel-deprecation", "destination": "https://docs.google.com/document/d/1ty3js_Eg2sNIbDuyYS_aV7h4jYdx1hEpX_mV135gO4s/edit?usp=sharing", "type": 301 }, { "source": "/go/macros-for-leak-tracker", "destination": "https://docs.google.com/document/d/1ireWmX4J5Jc6oDO1PmAXPlLdiAlCHvTz8SVC_Sg9KM8/edit?usp=sharing&resourcekey=0-yODb_SAStMgMefYpQeX8uQ", "type": 301 }, { "source": "/go/make-dropdownmenuitem-value-param-required", "destination": "https://docs.google.com/document/d/1x5jsgnLxI3wSDwXRzO0n5hdXKn2a_XTJcsXdjFZLX44/edit", "type": 301 }, { "source": "/go/match-xcode-deployment-range", "destination": "https://docs.google.com/document/d/1Y1WpbQPMOL3GvL8ow_OTD_-ENG3uuhS46CGRhLt12I8/edit?usp=sharing", "type": 301 }, From aba53fd6dddec2477389c96206e1c2b1d503b178 Mon Sep 17 00:00:00 2001 From: Victoria Ashworth <15619084+vashworth@users.noreply.github.com> Date: Mon, 18 May 2026 18:29:15 -0500 Subject: [PATCH 17/28] Add SwiftPM Add to App Docs (#13318) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _Description of what this PR is changing or adding, and why:_ This PR adds documentation on how to integrate your Flutter app into an existing native iOS or macOS app using Swift Package Manager. _Issues fixed by this PR (if any):_ _PRs or commits this PR depends on (if any):_ ## Presubmit checklist - [x] If you are unwilling, or unable, to sign the CLA, even for a _tiny_, one-word PR, please file an issue instead of a PR. - [x] If this PR is not meant to land until a future stable release, mark it as draft with an explanation. - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style)—for example, it doesn't use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first-person pronouns). - [ ] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --------- Co-authored-by: Shams Zakhour <44418985+sfshaza2@users.noreply.github.com> --- .../local-network-privacy-permissions.md | 113 +++++ sites/docs/src/content/add-to-app/index.md | 56 ++- .../add-to-app/ios/project-setup-legacy.md | 211 +++++++++ .../content/add-to-app/ios/project-setup.md | 407 ++++++++---------- .../add-to-app/macos/add-flutter-screen.md | 338 +++++++++++++++ .../content/add-to-app/macos/project-setup.md | 204 +++++++++ .../network-policy-ios-android.md | 6 +- sites/docs/src/data/sidenav/default.yml | 7 + .../build-phase-run-script.png | Bin 0 -> 84785 bytes .../flutter-build-mode.png | Bin 0 -> 14051 bytes .../flutternativeintegration-library.png | Bin 0 -> 27659 bytes ...ternativeintegration-relative-location.png | Bin 0 -> 15748 bytes .../ios/project-setup-swiftpm/pre-action.png | Bin 0 -> 48162 bytes .../allow-jit-build-setting.png | Bin 0 -> 10071 bytes ...ternativeintegration-relative-location.png | Bin 0 -> 15855 bytes 15 files changed, 1109 insertions(+), 233 deletions(-) create mode 100644 sites/docs/src/_includes/docs/add-to-app/ios-project/local-network-privacy-permissions.md create mode 100644 sites/docs/src/content/add-to-app/ios/project-setup-legacy.md create mode 100644 sites/docs/src/content/add-to-app/macos/add-flutter-screen.md create mode 100644 sites/docs/src/content/add-to-app/macos/project-setup.md create mode 100644 sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/build-phase-run-script.png create mode 100644 sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutter-build-mode.png create mode 100644 sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-library.png create mode 100644 sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-relative-location.png create mode 100644 sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/pre-action.png create mode 100644 sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/allow-jit-build-setting.png create mode 100644 sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/flutternativeintegration-relative-location.png diff --git a/sites/docs/src/_includes/docs/add-to-app/ios-project/local-network-privacy-permissions.md b/sites/docs/src/_includes/docs/add-to-app/ios-project/local-network-privacy-permissions.md new file mode 100644 index 0000000000..3775c94d4a --- /dev/null +++ b/sites/docs/src/_includes/docs/add-to-app/ios-project/local-network-privacy-permissions.md @@ -0,0 +1,113 @@ +On iOS 14 and later, enable the Dart multicast DNS service in the +**Debug** version of your iOS app. +This adds [debugging functionalities such as hot-reload and DevTools][] +using `flutter attach`. + +:::warning +Never enable this service in the **Release** version of your app. +The Apple App Store might reject your app. +::: + +To set local network privacy permissions only in the Debug version of your app, +create a separate `Info.plist` per build configuration. +SwiftUI projects start without an `Info.plist` file. +If you need to create a property list, +you can do so through Xcode or text editor. +The following instructions assume the default **Debug** and **Release**. +Adjust the names as needed depending on your app's build configurations. + +1. Create a new property list. + + 1. Open your project in Xcode. + + 1. In the **Project Navigator**, click on the project name. + + 1. From the **Targets** list in the Editor pane, click on your app. + + 1. Click the **Info** tab. + + 1. Expand **Custom iOS Target Properties**. + + 1. Right-click on the list and select **Add Row**. + + 1. From the dropdown menu, select **Bonjour Services**. + This creates a new property list in the project directory + called `Info`. This displays as `Info.plist` in the Finder. + +1. Rename the `Info.plist` to `Info-Debug.plist` + + 1. Click on **Info** file in the project list at the left. + + 1. In the **Identity and Type** panel at the right, + change the **Name** from `Info.plist` to `Info-Debug.plist`. + +1. Create a Release property list. + + 1. In the **Project Navigator**, click on `Info-Debug.plist`. + + 1. Select **File** > **Duplicate...**. + You can also press Cmd + Shift + S. + + 1. In the dialog box, set the **Save As:** field to + `Info-Release.plist` and click **Save**. + +1. Add the necessary properties to the **Debug** property list. + + 1. In the **Project Navigator**, click on `Info-Debug.plist`. + + 1. Add the String value `_dartVmService._tcp` + to the **Bonjour Services** array. + + 1. _(Optional)_ To set your desired customized permission dialog text, + add the key **Privacy - Local Network Usage Description**. + + + +1. Set the target to use different property lists for different build modes. + + 1. In the **Project Navigator**, click on your project. + + 1. Click the **Build Settings** tab. + + 1. Click **All** and **Combined** sub-tabs. + + 1. In the Search box, type `plist`. + This limits the settings to those that include property lists. + + 1. Scroll through the list until you see **Packaging**. + + 1. Click on the **Info.plist File** setting. + + 1. Change the **Info.plist File** value + from `path/to/Info.plist` to `path/to/Info-$(CONFIGURATION).plist`. + + + + This resolves to the path **Info-Debug.plist** in **Debug** and + **Info-Release.plist** in **Release**. + + + +1. Remove the **Release** property list from the **Build Phases**. + + 1. In the **Project Navigator**, click on your project. + + 1. Click the **Build Phases** tab. + + 1. Expand **Copy Bundle Resources**. + + 1. If this list includes `Info-Release.plist`, + click on it and then click the **-** (minus sign) under it + to remove the property list from the resources list. + + + +1. The first Flutter screen your Debug app loads prompts + for local network permission. + + Click **OK**. + + _(Optional)_ To grant permission before the app loads, enable + **Settings > Privacy > Local Network > Your App**. + +[debugging functionalities such as hot-reload and DevTools]: /add-to-app/debugging \ No newline at end of file diff --git a/sites/docs/src/content/add-to-app/index.md b/sites/docs/src/content/add-to-app/index.md index 10bbc9e138..bbd82e6bd8 100644 --- a/sites/docs/src/content/add-to-app/index.md +++ b/sites/docs/src/content/add-to-app/index.md @@ -1,7 +1,7 @@ --- title: Add Flutter to an existing app shortTitle: Add to app -description: Adding Flutter as a library to an existing Android or iOS app. +description: Adding Flutter as a library to an existing Android, iOS, macOS, or web app. --- ## Add-to-app @@ -17,11 +17,11 @@ the rest can be rendered using existing technology. This method can also be used to run shared non-UI logic by taking advantage of Dart's portability and interoperability with other languages. -Add-to-app is currently supported on Android, iOS, and web. +Add-to-app is currently supported on Android, iOS, macOS, and web. Flutter supports two flavors of add-to-app: -- **Multi-engine**: supported on Android and iOS, allows running one or more +- **Multi-engine**: supported on Android, iOS, and macOS, allows running one or more instances of Flutter, each rendering a widget embedded into the host application. Each instance is a separate Dart program, running in isolation from other programs. Having multiple Flutter instances allows each instance to @@ -72,10 +72,9 @@ various use-cases. Two of the most common use-cases are: -* Auto-build and import the Flutter module by adding a Flutter - SDK hook to your CocoaPods and to your Xcode build phase. -* Build your Flutter module into a generic [iOS Framework][] +* Build your Flutter module into a Swift package for integration into your own build system. +* Auto-build and import the Flutter module using Xcode build phases. * [`FlutterEngine`][ios-engine] API for starting and persisting your Flutter environment independently of attaching a [`FlutterViewController`][]. @@ -90,6 +89,20 @@ See our [add-to-app GitHub Samples repository][] for sample projects in Android and iOS that import a Flutter module for UI. +### Add to macOS applications +* Build your Flutter module into a Swift package + for integration into your own build system. +* Auto-build and import the Flutter module using Xcode build phases. +* [`FlutterEngine`][macos-engine] API for starting and persisting + your Flutter environment independently of attaching a + [`FlutterViewController`][macos-flutterviewcontroller]. +* Swift host apps supported. +* Flutter modules can use [Flutter plugins][] to interact + with the platform. +* Support for Flutter debugging and stateful hot reload by + using `flutter attach` from IDEs or the command line to + connect to an app that contains Flutter. + ### Add to web applications Flutter can be added to any existing HTML DOM-based web app written in any @@ -119,7 +132,7 @@ To add Flutter to an existing app, build it normally, then follow the ## Get started To get started, see our project integration guide for -Android and iOS: +Android, web, iOS, and macOS: + +
+ Web +
+
+ + + @@ -150,14 +171,23 @@ see our API usage guides at the following links: Android - + + +
+ web +
+
+ + + @@ -197,3 +227,5 @@ Web limitations: [maintained by the Flutter team]: {{site.repo.packages}}/tree/main/packages [multiple Flutters]: /add-to-app/multiple-flutters [FlutterView]: https://api.flutter.dev/flutter/dart-ui/FlutterView-class.html +[macos-engine]: {{site.api}}/macos-embedder/interface_flutter_engine.html +[macos-flutterviewcontroller]: {{site.api}}/macos-embedder/interface_flutter_view_controller.html \ No newline at end of file diff --git a/sites/docs/src/content/add-to-app/ios/project-setup-legacy.md b/sites/docs/src/content/add-to-app/ios/project-setup-legacy.md new file mode 100644 index 0000000000..d25ec14b64 --- /dev/null +++ b/sites/docs/src/content/add-to-app/ios/project-setup-legacy.md @@ -0,0 +1,211 @@ +--- +title: Integrate a Flutter module into your iOS project (Legacy) +shortTitle: Integrate Flutter (Legacy) +description: Learn how to integrate a Flutter module into your existing iOS project. +--- + +:::warning + +As of Flutter 3.44, Swift Package Manager (SwiftPM) replaces CocoaPods +as the default dependency manager for iOS and macOS Flutter apps. +CocoaPods is officially in maintenance mode, +and its registry will permanently [become read-only on December 2, 2026][]. + +This guide is preserved for reference only, and will not receive ongoing maintenance. +Please migrate to using Swift Package Manager using the [updated integration guide][]. + +::: + +Flutter UI components can be incrementally added into your existing iOS +application as embedded frameworks. +To embed Flutter in your existing application, +consider one of the following three methods. + +| Embedding Method | Methodology | Benefit | +|---|---|---| +| Use CocoaPods _(Recommended)_ | Install and use the Flutter SDK and CocoaPods. Flutter compiles the `flutter_module` from source each time Xcode builds the iOS app. | Least complicated method to embed Flutter into your app. | +| Use [iOS frameworks][] | Create iOS frameworks for Flutter components, embed them into your iOS, and update your existing app's build settings. | Doesn't require every developer to install the Flutter SDK and CocoaPods on their local machines. | +| Use iOS frameworks and CocoaPods | Embed the frameworks for your iOS app and the plugins in Xcode, but distribute the Flutter engine as a CocoaPods podspec. | Provides an alternative to distributing the large Flutter engine (`Flutter.xcframework`) library. | + +{:.table .table-striped} + +[iOS frameworks]: {{site.apple-dev}}/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html + +When you add Flutter to your existing iOS app, +it [increases the size of your iOS app][app-size]. + +For examples using an app built with UIKit, +see the iOS directories in the [add_to_app code samples][]. +For an example using SwiftUI, consult the iOS directory in [News Feed App][]. + +## Development system requirements + +Flutter requires the latest version of Xcode and [CocoaPods][]. + +## Create a Flutter module + +To embed Flutter into your existing application with any method, +create a Flutter module first. +Use the following command to create a Flutter module. + +```console +$ cd /path/to/my_flutter +$ flutter create --template module my_flutter +``` + +Flutter creates module project under `/path/to/my_flutter/`. +If you use the [CocoaPods method][], save the module +in the same parent directory as your existing iOS app. + +[CocoaPods method]: /add-to-app/ios/project-setup-legacy/?tab=embed-using-cocoapods + +From the Flutter module directory, +you can run the same `flutter` commands you would in any other Flutter project, +like `flutter run` or `flutter build ios`. +You can also run the module in [VS Code][] or +[Android Studio/IntelliJ][] with the Flutter and Dart plugins. +This project contains a single-view example version of your module +before embedding it in your existing iOS app. +This helps when testing the Flutter-only parts of your code. + +## Organize your module + +The `my_flutter` module directory structure resembles a typical Flutter app. + + + +- my_flutter/ + - .ios/ + - Runner.xcworkspace + - Flutter/ + - podhelper.rb + - lib/ + - main.dart + - test/ + - pubspec.yaml + + + +Your Dart code should be added to the `lib/` directory. +Your Flutter dependencies, packages, and plugins must be added to the +`pubspec.yaml` file. + +The `.ios/` hidden subfolder contains an Xcode workspace where +you can run a standalone version of your module. +This wrapper project bootstraps your Flutter code. +It contains helper scripts to facilitate building frameworks or +embedding the module into your existing application with CocoaPods. + +:::note + +* Add custom iOS code to your own existing application's + project or to a plugin, not to the module's `.ios/` + directory. Changes made in your module's `.ios/` + directory don't appear in your existing iOS project + using the module, and might be overwritten by Flutter. + +* Exclude the `.ios/` directory from source control as + it's autogenerated. + +* Before building the module on a new machine, + run `flutter pub get` in the `my_flutter` directory. + This regenerates the `.ios/` directory before building + the iOS project that uses the Flutter module. + +::: + +## Embed a Flutter module in your iOS app + +After you have developed your Flutter module, +you can embed it using the methods described +in the table at the top of the page. + +You can run in **Debug** mode on a simulator or a real device, +and **Release** mode on a real device. + +:::note +Learn more about [Flutter's build modes][build modes of Flutter]. + +To use Flutter debugging features such as hot reload, +consult [Debugging your add-to-app module][]. +::: + + + + +{% render "docs/add-to-app/ios-project/embed-cocoapods.md" %} + + + + +{% render "docs/add-to-app/ios-project/embed-frameworks.md" %} + + + + +{% render "docs/add-to-app/ios-project/embed-split.md" %} + + + + + +## Set local network privacy permissions + +{% render "docs/add-to-app/ios-project/local-network-privacy-permissions.md" %} + +## Mitigate known issue with Apple Silicon Macs + +On [Macs running Apple Silicon][apple-silicon], +the host app builds for an `arm64` simulator. +While Flutter supports `arm64` simulators, some plugins might not. +If you use one of these plugins, you might see a compilation error like +**Undefined symbols for architecture arm64**. +If this occurs, +exclude `arm64` from the simulator architectures in your host app. + +1. In the **Project Navigator**, click on your project. + +1. Click the **Build Settings** tab. + +1. Click **All** and **Combined** sub-tabs. + +1. Under **Architectures**, click on **Excluded Architectures**. + +1. Expand to see the available build configurations. + +1. Click **Debug**. + +1. Click the **+** (plus sign). + +1. Select **iOS Simulator**. + +1. Double-click in the value column for **Any iOS Simulator SDK**. + +1. Click the **+** (plus sign). + +1. Type `arm64` in the **Debug > Any iOS Simulator SDK** dialog box. + + + +1. Press Esc to close this dialog box. + +1. Repeat these steps for the **Release** build mode. + +1. Repeat for any iOS unit test targets. + +## Next steps + +You can now [add a Flutter screen][] to your existing iOS app. + +[add_to_app code samples]: {{site.repo.samples}}/tree/main/add_to_app +[add a Flutter screen]: /add-to-app/ios/add-flutter-screen +[Android Studio/IntelliJ]: /tools/android-studio +[build modes of Flutter]: /testing/build-modes +[CocoaPods]: https://cocoapods.org/ +[app-size]: /resources/faq#how-big-is-the-flutter-engine +[VS Code]: /tools/vs-code +[News Feed app]: https://github.com/flutter/put-flutter-to-work/tree/022208184ec2623af2d113d13d90e8e1ce722365 +[Debugging your add-to-app module]: /add-to-app/debugging/ +[apple-silicon]: https://support.apple.com/en-us/116943 +[become read-only on December 2, 2026]: https://blog.cocoapods.org/CocoaPods-Specs-Repo/ +[updated integration guide]: /add-to-app/ios/project-setup \ No newline at end of file diff --git a/sites/docs/src/content/add-to-app/ios/project-setup.md b/sites/docs/src/content/add-to-app/ios/project-setup.md index a4588b477e..55f6666ee4 100644 --- a/sites/docs/src/content/add-to-app/ios/project-setup.md +++ b/sites/docs/src/content/add-to-app/ios/project-setup.md @@ -1,308 +1,277 @@ --- -title: Integrate a Flutter module into your iOS project +title: Integrate a Flutter app into your iOS project shortTitle: Integrate Flutter -description: Learn how to integrate a Flutter module into your existing iOS project. +description: Learn how to integrate a Flutter app into your existing iOS project. --- -Flutter UI components can be incrementally added into your existing iOS -application as embedded frameworks. -To embed Flutter in your existing application, -consider one of the following three methods. +:::tip New! This guide has been updated to use Swift Package Manager -| Embedding Method | Methodology | Benefit | -|---|---|---| -| Use CocoaPods _(Recommended)_ | Install and use the Flutter SDK and CocoaPods. Flutter compiles the `flutter_module` from source each time Xcode builds the iOS app. | Least complicated method to embed Flutter into your app. | -| Use [iOS frameworks][] | Create iOS frameworks for Flutter components, embed them into your iOS, and update your existing app's build settings. | Doesn't require every developer to install the Flutter SDK and CocoaPods on their local machines. | -| Use iOS frameworks and CocoaPods | Embed the frameworks for your iOS app and the plugins in Xcode, but distribute the Flutter engine as a CocoaPods podspec. | Provides an alternative to distributing the large Flutter engine (`Flutter.xcframework`) library. | +As of Flutter 3.44, Swift Package Manager replaces CocoaPods +as the default dependency manager for iOS and macOS Flutter apps. +CocoaPods is officially in maintenance mode, +and its registry will permanently [become read-only on December 2, 2026][]. -{:.table .table-striped} +The [legacy integration guide][] is preserved for reference, +but will not receive ongoing maintenance. +Please migrate to using Swift Package Manager. -[iOS frameworks]: {{site.apple-dev}}/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html +::: -When you add Flutter to your existing iOS app, -it [increases the size of your iOS app][app-size]. +Flutter UI components can be incrementally added +into your existing iOS application using Swift packages. -For examples using an app built with UIKit, -see the iOS directories in the [add_to_app code samples][]. -For an example using SwiftUI, consult the iOS directory in [News Feed App][]. +## Prerequisites -## Development system requirements +* Flutter 3.44 or later +* Xcode 15.0 or later -Flutter requires the latest version of Xcode and [CocoaPods][]. +### Migrate from Legacy Integration (If Applicable) {: #migrate-legacy-integration} -## Create a Flutter module +If you've already integrated Flutter into your iOS app +using CocoaPods or embedded frameworks, +you must first remove that integration +before following the Swift Package Manager instructions below. -To embed Flutter into your existing application with any method, -create a Flutter module first. -Use the following command to create a Flutter module. +
+ Expand to see instructions to migrate from CocoaPods integration -```console -$ cd /path/to/my_flutter -$ flutter create --template module my_flutter -``` + If your app was previously integrated using CocoaPods, + you must first remove the Flutter installation code from your Podfile. -Flutter creates module project under `/path/to/my_flutter/`. -If you use the [CocoaPods method][], save the module -in the same parent directory as your existing iOS app. + 1. Remove Flutter installation code from your Podfile + ```ruby title="MyApp/Podfile" diff + - flutter_application_path = '../my_flutter' + - load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb') -[CocoaPods method]: /add-to-app/ios/project-setup/?tab=embed-using-cocoapods + - install_all_flutter_pods(flutter_application_path) -From the Flutter module directory, -you can run the same `flutter` commands you would in any other Flutter project, -like `flutter run` or `flutter build ios`. -You can also run the module in [VS Code][] or -[Android Studio/IntelliJ][] with the Flutter and Dart plugins. -This project contains a single-view example version of your module -before embedding it in your existing iOS app. -This helps when testing the Flutter-only parts of your code. + - flutter_post_install(installer) if defined?(flutter_post_install) + ``` -## Organize your module + 1. Run `pod install`. +
-The `my_flutter` module directory structure resembles a typical Flutter app. +
+ Expand to see instructions to migrate from embedded frameworks integration - + If your app was previously integrated using frameworks + generated by the `flutter build ios-framework` command, + you must first remove the frameworks from your Xcode project. -- my_flutter/ - - .ios/ - - Runner.xcworkspace - - Flutter/ - - podhelper.rb - - lib/ - - main.dart - - test/ - - pubspec.yaml + 1. Navigate to your target's General tab + and remove all Flutter-related frameworks and libraries + under **Frameworks, Libraries, and Embedded Content**. - - -Your Dart code should be added to the `lib/` directory. -Your Flutter dependencies, packages, and plugins must be added to the -`pubspec.yaml` file. - -The `.ios/` hidden subfolder contains an Xcode workspace where -you can run a standalone version of your module. -This wrapper project bootstraps your Flutter code. -It contains helper scripts to facilitate building frameworks or -embedding the module into your existing application with CocoaPods. + This includes the `App.xcframework`, `Flutter.xcframework`, + `FlutterPluginRegistrant.xcframework`, + and any Flutter plugins' `xcframework` files. -:::note - -* Add custom iOS code to your own existing application's - project or to a plugin, not to the module's `.ios/` - directory. Changes made in your module's `.ios/` - directory don't appear in your existing iOS project - using the module, and might be overwritten by Flutter. + 1. Remove the Flutter pod from your Podfile + ```ruby title="MyApp/Podfile" diff + - pod 'Flutter', :podspec => '/path/to/MyApp/Flutter/[build mode]/Flutter.podspec' + ``` -* Exclude the `.ios/` directory from source control as - it's autogenerated. + 1. Run `pod install`. +
-* Before building the module on a new machine, - run `flutter pub get` in the `my_flutter` directory. - This regenerates the `.ios/` directory before building - the iOS project that uses the Flutter module. +The [legacy integration guide][] is preserved for reference, +but will not receive ongoing maintenance. -::: +### Organize your projects relative to each other {: #organize-projects-relatively} -## Embed a Flutter module in your iOS app +This guide assumes that your existing iOS app +and your Flutter app or module reside in sibling directories. +If you have a different directory structure, +you will need to adjust the example relative paths accordingly. -After you have developed your Flutter module, -you can embed it using the methods described -in the table at the top of the page. +:::note -You can run in **Debug** mode on a simulator or a real device, -and **Release** mode on a real device. +If integrating for the first time, +it's recommended to use a Flutter application (instead of a module). +Run the following command to create a new Flutter application: -:::note -Learn more about [Flutter's build modes][build modes of Flutter]. +```console +flutter create my_flutter_app +``` -To use Flutter debugging features such as hot reload, -consult [Debugging your add-to-app module][]. ::: - - +The example directory structure resembles the following: -{% render "docs/add-to-app/ios-project/embed-cocoapods.md" %} + + - - + -{% render "docs/add-to-app/ios-project/embed-frameworks.md" %} +- my_flutter_app/ + - ios/ + - lib/ + - main.dart +- MyNativeApp/ + - MyNativeApp.xcodeproj/ + - + -{% render "docs/add-to-app/ios-project/embed-split.md" %} + + +- my_flutter_app/ + - .ios/ + - lib/ + - main.dart +- MyNativeApp/ + - MyNativeApp.xcodeproj/ + +## Integrate with Swift Package Manager {: #integrate-with-swiftpm} -## Set local network privacy permissions - -On iOS 14 and later, enable the Dart multicast DNS service in the -**Debug** version of your iOS app. -This adds [debugging functionalities such as hot-reload and DevTools][] -using `flutter attach`. - -:::warning -Never enable this service in the **Release** version of your app. -The Apple App Store might reject your app. -::: - -To set local network privacy permissions only in the Debug version of your app, -create a separate `Info.plist` per build configuration. -SwiftUI projects start without an `Info.plist` file. -If you need to create a property list, -you can do so through Xcode or text editor. -The following instructions assume the default **Debug** and **Release**. -Adjust the names as needed depending on your app's build configurations. - -1. Create a new property list. - - 1. Open your project in Xcode. - - 1. In the **Project Navigator**, click on the project name. - - 1. From the **Targets** list in the Editor pane, click on your app. - - 1. Click the **Info** tab. - - 1. Expand **Custom iOS Target Properties**. - - 1. Right-click on the list and select **Add Row**. - - 1. From the dropdown menu, select **Bonjour Services**. - This creates a new property list in the project directory - called `Info`. This displays as `Info.plist` in the Finder. - -1. Rename the `Info.plist` to `Info-Debug.plist` - - 1. Click on **Info** file in the project list at the left. - - 1. In the **Identity and Type** panel at the right, - change the **Name** from `Info.plist` to `Info-Debug.plist`. - -1. Create a Release property list. - - 1. In the **Project Navigator**, click on `Info-Debug.plist`. - - 1. Select **File** > **Duplicate...**. - You can also press Cmd + Shift + S. - - 1. In the dialog box, set the **Save As:** field to - `Info-Release.plist` and click **Save**. - -1. Add the necessary properties to the **Debug** property list. - - 1. In the **Project Navigator**, click on `Info-Debug.plist`. - - 1. Add the String value `_dartVmService._tcp` - to the **Bonjour Services** array. + 1.

Build the FlutterNativeIntegration Swift package

- 1. _(Optional)_ To set your desired customized permission dialog text, - add the key **Privacy - Local Network Usage Description**. + Within your Flutter application or module, run the following command: - + ```console + flutter build swift-package --platform ios + ``` -1. Set the target to use different property lists for different build modes. + This will generate the following directories: - 1. In the **Project Navigator**, click on your project. + - 1. Click the **Build Settings** tab. + - my_flutter_app/build/ios/SwiftPackages/ + - FlutterNativeIntegration/ (A Swift package) + - Scripts/ (Directory of scripts and other files needed) - 1. Click **All** and **Combined** sub-tabs. + - 1. In the Search box, type `plist`. - This limits the settings to those that include property lists. + You can optionally change the location of this output + with the `--output` flag. - 1. Scroll through the list until you see **Packaging**. + 1.

Add FlutterNativeIntegration to your Xcode project

- 1. Click on the **Info.plist File** setting. + 1. Open your existing iOS app in Xcode. + 1. In the Project navigator, right click on your project + and select **Add Files to "MyNativeApp"...** + 1. Navigate to and select the generated + `FlutterNativeIntegration` Swift package and click **Add**. + 1. Select **Reference files in place** and click **Finish**. + 1. In the File inspector, + verify the **Location** is **Relative to Project**. + If it is not, you'll need to move the Flutter output directory + to be a sibling directory of your native app. - 1. Change the **Info.plist File** value - from `path/to/Info.plist` to `path/to/Info-$(CONFIGURATION).plist`. + - + 1. Navigate to your target's **General** tab + and add `FlutterNativeIntegration` under + **Frameworks, Libraries, and Embedded Content**. + - This resolves to the path **Info-Debug.plist** in **Debug** and - **Info-Release.plist** in **Release**. + 1.

Add build settings

- + 1. In the **Build Settings** tab, + set the location of the Flutter app's Swift package output directory: + ``` + FLUTTER_SWIFT_PACKAGE_OUTPUT=$SRCROOT/../my_flutter_app/build/ios/SwiftPackages + ``` -1. Remove the **Release** property list from the **Build Phases**. + 1. For custom configurations, set the Flutter build mode. - 1. In the **Project Navigator**, click on your project. + Flutter supports three [build modes][]: Debug, Profile, and Release. + The build mode is determined using the `CONFIGURATION`. + If your configuration does not match one of these, + you can set the `FLUTTER_BUILD_MODE` build setting + to one of these values. - 1. Click the **Build Phases** tab. + - 1. Expand **Copy Bundle Resources**. + 1. (Optional) Allow Xcode to re-build your Flutter app. - 1. If this list includes `Info-Release.plist`, - click on it and then click the **-** (minus sign) under it - to remove the property list from the resources list. + Add the below build settings to your target + to allow Xcode to re-build your Flutter app as part of its build. + This allows you to make changes to your Flutter application + without needing to re-run `flutter build swift-package`. + This requires Flutter to be installed on the machine. - + ``` + FLUTTER_APPLICATION_PATH=$SRCROOT/../my_flutter_app + ENABLE_USER_SCRIPT_SANDBOXING=NO + ``` -1. The first Flutter screen your Debug app loads prompts - for local network permission. + :::tip + This only re-builds the Flutter app's code. + If you add new dependencies, + you’ll need to re-run `flutter build swift-package`. + ::: - Click **OK**. + 1.

Add Pre-action Run Script to Scheme

- _(Optional)_ To grant permission before the app loads, enable - **Settings > Privacy > Local Network > Your App**. + 1. Open **Product** > **Scheme** > **Edit Scheme...** + > **Build** (in left side bar) > **Pre-action** > **+** + > **New Run Script Action** -## Mitigate known issue with Apple Silicon Macs + 1. Select your project in the **Provide build settings from** dropdown. -On [Macs running Apple Silicon][apple-silicon], -the host app builds for an `arm64` simulator. -While Flutter supports `arm64` simulators, some plugins might not. -If you use one of these plugins, you might see a compilation error like -**Undefined symbols for architecture arm64**. -If this occurs, -exclude `arm64` from the simulator architectures in your host app. + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh prebuild + ``` -1. In the **Project Navigator**, click on your project. + -1. Click the **Build Settings** tab. + 1.

Add New Run Script Build Phase to Target

-1. Click **All** and **Combined** sub-tabs. + 1. Navigate to your target's **Build Phases** + > **+** > **New Run Script Phase** -1. Under **Architectures**, click on **Excluded Architectures**. + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh assemble + ``` + 1. Uncheck **Based on dependency analysis** + 1. Add the following to **Input File Lists**: + ``` + $(FLUTTER_SWIFT_PACKAGE_OUTPUT)/Scripts/FlutterAssembleInputs.xcfilelist + ``` -1. Expand to see the available build configurations. + -1. Click **Debug**. + 1.

(Optional) Set LLDB Init File

-1. Click the **+** (plus sign). + Using Flutter's LLDB Init File improves performance + when debugging on physical iOS 26+ devices. -1. Select **iOS Simulator**. + 1. Open **Product** > **Scheme** > **Edit Scheme...** > **Run** (in left side bar). + 1. Set the **LLDB Init File** to the following path: + ``` + $(FLUTTER_SWIFT_PACKAGE_OUTPUT)/Scripts/flutter_lldbinit + ``` -1. Double-click in the value column for **Any iOS Simulator SDK**. + Alternatively, if your scheme already has an LLDB Init File, + you can add Flutter's LLDB file to it. + The path to Flutter's LLDB Init File must be relative + to the location of your project's LLDB Init File. -1. Click the **+** (plus sign). + ``` + command source --relative-to-command-file "../my_flutter_app/build/ios/SwiftPackages/Scripts/flutter_lldbinit" + ``` -1. Type `arm64` in the **Debug > Any iOS Simulator SDK** dialog box. +{:.steps} - +## Set local network privacy permissions {: #local-network-permissions} -1. Press Esc to close this dialog box. +{% render "docs/add-to-app/ios-project/local-network-privacy-permissions.md" %} -1. Repeat these steps for the **Release** build mode. -1. Repeat for any iOS unit test targets. ## Next steps You can now [add a Flutter screen][] to your existing iOS app. -[add_to_app code samples]: {{site.repo.samples}}/tree/main/add_to_app [add a Flutter screen]: /add-to-app/ios/add-flutter-screen -[Android Studio/IntelliJ]: /tools/android-studio -[build modes of Flutter]: /testing/build-modes -[CocoaPods]: https://cocoapods.org/ -[debugging functionalities such as hot-reload and DevTools]: /add-to-app/debugging -[app-size]: /resources/faq#how-big-is-the-flutter-engine -[VS Code]: /tools/vs-code -[News Feed app]: https://github.com/flutter/put-flutter-to-work/tree/022208184ec2623af2d113d13d90e8e1ce722365 -[Debugging your add-to-app module]: /add-to-app/debugging/ -[apple-silicon]: https://support.apple.com/en-us/116943 +[legacy integration guide]: /add-to-app/ios/project-setup-legacy +[become read-only on December 2, 2026]: https://blog.cocoapods.org/CocoaPods-Specs-Repo/ +[build modes]: /testing/build-modes \ No newline at end of file diff --git a/sites/docs/src/content/add-to-app/macos/add-flutter-screen.md b/sites/docs/src/content/add-to-app/macos/add-flutter-screen.md new file mode 100644 index 0000000000..69db3b5c11 --- /dev/null +++ b/sites/docs/src/content/add-to-app/macos/add-flutter-screen.md @@ -0,0 +1,338 @@ +--- +title: Add a Flutter screen to an macOS app +shortTitle: Add a Flutter screen +description: Learn how to add a single Flutter screen to your existing macOS app. +--- + +This guide describes how to add a single Flutter screen to an existing macOS app. + +## Start a FlutterEngine and FlutterViewController + +To launch a Flutter screen from an existing macOS app, +you start a [`FlutterEngine`][] and a [`FlutterViewController`][]. + +:::note +The `FlutterEngine` serves as a host to the Dart VM and your Flutter runtime, +and the `FlutterViewController` attaches to a `FlutterEngine` +to pass input events into Flutter +and to display frames rendered by the `FlutterEngine`. +::: + +The `FlutterEngine` might have the same lifespan +as your `FlutterViewController` or outlive your `FlutterViewController`. + +:::tip +It's generally recommended to pre-warm a long-lived +`FlutterEngine` for your application because: + +* The first frame appears faster when showing the `FlutterViewController`. +* Your Flutter and Dart state will outlive one `FlutterViewController`. +* Your application and your plugins can interact with Flutter + and your Dart logic before showing the UI. +::: + +See [Loading sequence and performance][] +for more analysis on the latency and memory +trade-offs of pre-warming an engine. + +### Create a FlutterEngine + +Where you create a `FlutterEngine` depends on your host app. + + + + +In this example, we create a `FlutterEngine` object +inside a SwiftUI [`Observable`][] object called `FlutterDependencies`. +Pre-warm the engine by calling `run()`, and then inject this object +into a `ContentView` using the `environment()` view modifier. + + ```swift title="MyApp.swift" +import SwiftUI +import FlutterMacOS +// The following library connects plugins with macOS platform code to this app. +import FlutterPluginRegistrant + +@Observable +class FlutterDependencies { + let flutterEngine = FlutterEngine(name: "my flutter engine", project: nil) + init() { + // Runs the default Dart entrypoint with a default Flutter route. + flutterEngine.run(withEntrypoint: nil) + // Connects plugins with macOS platform code to this app. + RegisterGeneratedPlugins(registry: self.flutterEngine) + } +} + +@main +struct MyApp: App { + // flutterDependencies will be injected through the view environment. + @State var flutterDependencies = FlutterDependencies() + var body: some Scene { + WindowGroup { + ContentView() + .environment(flutterDependencies) + } + } +} +``` + + + + +As an example, we demonstrate creating a `FlutterEngine`, +exposed as a property, on app startup in the app delegate. + +```swift title="AppDelegate.swift" +import Cocoa +import FlutterMacOS +// The following library connects plugins with macOS platform code to this app. +import FlutterPluginRegistrant + +@main +class AppDelegate: FlutterAppDelegate { + lazy var flutterEngine = FlutterEngine(name: "my flutter engine", project: nil) + + override func applicationDidFinishLaunching(_ aNotification: Notification) { + flutterEngine.run(withEntrypoint: nil) + RegisterGeneratedPlugins(registry: self.flutterEngine) + } +} +``` + + + + +### Show a FlutterViewController with your FlutterEngine + + + + +The following example shows a generic `ContentView` with a +[`NavigationLink`][] hooked to a flutter screen. +First, create a `FlutterViewControllerRepresentable` +to represent the `FlutterViewController`. +The `FlutterViewController` constructor takes +the pre-warmed `FlutterEngine` as an argument, +which is injected through the view environment. + +```swift title="ContentView.swift" +import SwiftUI +import FlutterMacOS + +struct FlutterViewControllerRepresentable: NSViewControllerRepresentable { + // Flutter dependencies are passed in through the view environment. + @Environment(FlutterDependencies.self) var flutterDependencies + + func makeNSViewController(context: Context) -> FlutterViewController { + return FlutterViewController( + engine: flutterDependencies.flutterEngine, + nibName: nil, + bundle: nil + ) + } + + func updateNSViewController(_ nsViewController: FlutterViewController, context: Context) {} +} + +struct ContentView: View { + var body: some View { + NavigationStack { + NavigationLink("My Flutter Feature") { + FlutterViewControllerRepresentable() + } + } + } +} +``` + +Now, you have a Flutter screen embedded in your macOS app. + +:::note +In this example, your Dart `main()` entrypoint function runs +when the `FlutterDependencies` observable is initialized. +::: + + + + +The following example shows a generic `ViewController` with an +`NSButton` hooked to present a [`FlutterViewController`][]. +The `FlutterViewController` uses the `FlutterEngine` instance +created in the `AppDelegate`. + +```swift title="ViewController.swift" +import Cocoa +import FlutterMacOS + +class ViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Make a button to call the showFlutter function when pressed. + let button = NSButton(title: "Show Flutter!", target: self, action: #selector(showFlutter)) + button.frame = CGRect(x: 202, y: 187, width: 160.0, height: 40.0) + self.view.addSubview(button) + } + + @objc func showFlutter() { + let flutterEngine = (NSApplication.shared.delegate as! AppDelegate).flutterEngine + let flutterViewController = + FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil) + self.addChild(flutterViewController) + flutterViewController.view.frame = self.view.bounds + presentAsModalWindow(flutterViewController) + } +} +``` + +Now, you have a Flutter screen embedded in your macOS app. + +:::note +Using the previous example, the default `main()` entrypoint function +of your default Dart library runs +when calling `run` on the `FlutterEngine` created in the `AppDelegate`. +::: + + + + +### _Alternatively_ - Create a FlutterViewController with an implicit FlutterEngine + +As an alternative to the previous example, +you can let the `FlutterViewController` implicitly create +its own `FlutterEngine` without pre-warming one ahead of time. + +This is not usually recommended +because creating a `FlutterEngine` on-demand could introduce a noticeable +latency between when the `FlutterViewController` is presented +and when it renders its first frame. +This could, however, be useful if the Flutter screen is rarely shown, +when there are no good heuristics +to determine when the Dart VM should be started, +and when Flutter doesn't need to persist state between view controllers. + +To let the `FlutterViewController` present without an existing `FlutterEngine`, +omit the `FlutterEngine` construction, +and create the `FlutterViewController` without an engine reference. + + + + +```swift title="ContentView.swift" +// Existing code omitted. +func makeNSViewController(context: Context) -> FlutterViewController { + return FlutterViewController() +} +``` + + + + +```swift title="ViewController.swift" +// Existing code omitted. +func showFlutter() { + let flutterViewController = FlutterViewController() + self.addChild(flutterViewController) + flutterViewController.view.frame = self.view.bounds + presentAsModalWindow(flutterViewController) +} +``` + + + + +See [Loading sequence and performance][] +for more explorations on latency and memory usage. + +## Using the FlutterAppDelegate + +Letting your application's `UIApplicationDelegate` subclass +`FlutterAppDelegate` is recommended but not required. + +The `FlutterAppDelegate` performs functions such as: + +* Forwarding application callbacks such as [`openURLs`][] + to plugins such as [google_sign_in][]. + +### Creating a FlutterAppDelegate subclass + +Creating a subclass of the `FlutterAppDelegate` in UIKit apps was shown +in the [Start a FlutterEngine and FlutterViewController section][]. +In a SwiftUI app, you can create a subclass of the `FlutterAppDelegate` +and annotate it with the [`Observable()`][] macro as follows: + +```swift title="MyApp.swift" +import SwiftUI +import FlutterMacOS + +@Observable +class AppDelegate: FlutterAppDelegate { + let flutterEngine = FlutterEngine(name: "my flutter engine", project: nil) + + override func applicationDidFinishLaunching(_ aNotification: Notification) { + // Runs the default Dart entrypoint with a default Flutter route. + flutterEngine.run(withEntrypoint: nil) + // Used to connect plugins (only if you have plugins + // with macOS platform code). + RegisterGeneratedPlugins(registry: self.flutterEngine) + } +} + +@main +struct MyApp: App { + // Use this property wrapper to tell SwiftUI + // it should use the AppDelegate class for the application delegate + @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate + + var body: some Scene { + WindowGroup { + ContentView() + } + } +} +``` + +Then, in your view, the `AppDelegate` is accessible +through the view environment. + +```swift title="ContentView.swift" +import SwiftUI +import FlutterMacOS + +struct FlutterViewControllerRepresentable: NSViewControllerRepresentable { + // Access the AppDelegate through the view environment. + @Environment(AppDelegate.self) var appDelegate + + func makeNSViewController(context: Context) -> FlutterViewController { + return FlutterViewController( + engine: appDelegate.flutterEngine, + nibName: nil, + bundle: nil + ) + } + + func updateNSViewController(_ nsViewController: FlutterViewController, context: Context) {} +} + +struct ContentView: View { + var body: some View { + NavigationStack { + NavigationLink("My Flutter Feature") { + FlutterViewControllerRepresentable() + } + } + } +} +``` + +[`FlutterEngine`]: {{site.api}}/macos-embedder/interface_flutter_engine.html +[`FlutterViewController`]: {{site.api}}/macos-embedder/interface_flutter_view_controller.html +[Loading sequence and performance]: /add-to-app/performance +[google_sign_in]: {{site.pub}}/packages/google_sign_in +[`openURLs`]: {{site.apple-dev}}/documentation/appkit/nsapplicationdelegate/application(_:open:) +[Start a FlutterEngine and FlutterViewController section]:/add-to-app/macos/add-flutter-screen/#start-a-flutterengine-and-flutterviewcontroller +[`Observable`]: {{site.apple-dev}}/documentation/observation/observable +[`NavigationLink`]: {{site.apple-dev}}/documentation/swiftui/navigationlink +[`Observable()`]: {{site.apple-dev}}/documentation/observation/observable() diff --git a/sites/docs/src/content/add-to-app/macos/project-setup.md b/sites/docs/src/content/add-to-app/macos/project-setup.md new file mode 100644 index 0000000000..be04ea4ea7 --- /dev/null +++ b/sites/docs/src/content/add-to-app/macos/project-setup.md @@ -0,0 +1,204 @@ +--- +title: Integrate a Flutter app into your macOS project +shortTitle: Integrate Flutter +description: Learn how to integrate a Flutter app into your existing macOS project. +--- + +Flutter UI components can be incrementally added +into your existing macOS application using Swift packages. + +## Prerequisites + +* Flutter 3.44 or later +* Xcode 15.0 or later + +### Migrate from legacy integration (if applicable) {: #migrate-legacy-integration} + +If you've already integrated Flutter into your macOS app +using embedded frameworks, +you must first remove that integration +before following the Swift Package Manager instructions below. + +
+ Expand to see instructions to migrate from embedded frameworks integration + + If your app was previously integrated using frameworks + generated by the `flutter build macos-framework` command, + you must first remove the frameworks from your Xcode project. + + 1. Navigate to your target's **General** tab + and remove all Flutter-related frameworks and libraries + under **Frameworks, Libraries, and Embedded Content**. + + This includes the `App.xcframework`, `FlutterMacOS.xcframework`, + `FlutterPluginRegistrant.xcframework`, + and any Flutter plugins' `xcframework` files. + + 1. Remove the Flutter pod from your Podfile + ```ruby title="MyApp/Podfile" diff + - pod 'FlutterMacOS', :podspec => '/path/to/MyApp/Flutter/[build mode]/FlutterMacOS.podspec' + ``` + + 1. Run `pod install`. +
+ +### Organize your projects relative to each other {: #organize-projects-relatively} + +This guide assumes that your existing macOS app +and your Flutter app reside in sibling directories. +If you have a different directory structure, +you will need to adjust the example relative paths accordingly. + +:::note + +If integrating for the first time, +run the following command to create a new Flutter application: + +```console +flutter create my_flutter_app +``` + +::: + +The example directory structure resembles the following: + + + +- my_flutter_app/ + - macos/ + - lib/ + - main.dart +- MyNativeApp/ + - MyNativeApp.xcodeproj/ + + + +## Integrate with Swift Package Manager {: #integrate-with-swiftpm} + + 1.

Build the FlutterNativeIntegration Swift package

+ + Within your Flutter application or module, run the following command: + + ```console + flutter build swift-package --platform macos + ``` + + This generates the following directories: + + + + - my_flutter_app/build/macos/SwiftPackages/ + - FlutterNativeIntegration/ (A Swift package) + - Scripts/ (Directory of scripts and other files needed) + + + + You can optionally change the location of this output + with the `--output` flag. + + 1.

Add FlutterNativeIntegration to your Xcode project

+ + 1. In the Project navigator, right click on your project + and select **Add Files to "MyNativeApp"...** + 1. Navigate to and select the generated + `FlutterNativeIntegration` Swift package and click **Add**. + 1. Select **Reference files in place** and click **Finish**. + 1. In the File inspector, + verify the **Location** is **Relative to Project**. + If it is not, you'll need to move the Flutter output directory + to be a sibling directory of your native app. + + + + 1. Navigate to your target's **General** tab + and add `FlutterNativeIntegration` under + **Frameworks, Libraries, and Embedded Content**. + + + 1.

Add build settings

+ + 1. In the **Build Settings** tab, + set the location of the Flutter app's Swift package output directory: + ``` + FLUTTER_SWIFT_PACKAGE_OUTPUT=$SRCROOT/../my_flutter_app/build/macos/SwiftPackages + ``` + 1. For custom configurations, set the Flutter build mode. + + Flutter supports three [build modes][]: Debug, Profile, and Release. + The build mode is determined using the `CONFIGURATION` value. + If your configuration does not match one of these, + you can set the `FLUTTER_BUILD_MODE` build setting + to one of these values. + + + + 1. For **Debug** configurations only, set the following build settings: + + ``` + ENABLE_APP_SANDBOX=YES + ENABLE_INCOMING_NETWORK_CONNECTIONS=YES + RUNTIME_EXCEPTION_ALLOW_JIT=YES + ``` + + + + 1. (Optional) Allow Xcode to re-build your Flutter app. + + Add the following build settings to your target + to allow Xcode to re-build your Flutter app as part of its build. + This allows you to make changes to your Flutter application + without needing to re-run `flutter build swift-package`. + This requires a Flutter installation on the machine. + + ``` + FLUTTER_APPLICATION_PATH=$SRCROOT/../my_flutter_app + ENABLE_USER_SCRIPT_SANDBOXING=NO + ``` + + :::tip + This only re-builds the Flutter app's code. + If you add new dependencies, + you’ll need to re-run `flutter build swift-package`. + ::: + + 1.

Add Pre-action Run Script to Scheme

+ + 1. Open **Product** > **Scheme** > **Edit Scheme...** + > **Build** (in left side bar) > **Pre-action** > **+** + > **New Run Script Action** + + 1. Select your project in the **Provide build settings from** dropdown. + + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh prebuild + ``` + + + + 1.

Add new run script build phase to your target

+ + 1. Navigate to your target's **Build Phases** + > **+** > **New Run Script Phase** + + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh assemble + ``` + 1. Uncheck **Based on dependency analysis** + 1. Add the following to **Input File Lists**: + ``` + $(FLUTTER_SWIFT_PACKAGE_OUTPUT)/Scripts/FlutterAssembleInputs.xcfilelist + ``` + + + +{:.steps} + +## Next steps + +You can now [add a Flutter screen][] to your existing macOS app. + +[add a Flutter screen]: /add-to-app/macos/add-flutter-screen +[become read-only on December 2, 2026]: https://blog.cocoapods.org/CocoaPods-Specs-Repo/ +[build modes]: /testing/build-modes \ No newline at end of file diff --git a/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md b/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md index f44f2ec740..73b0815eb5 100644 --- a/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md +++ b/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md @@ -37,7 +37,7 @@ network policy. See the migration guide below for details. :::important The following only applies to platform native sockets (sockets owned -by the Android and iOS platforms). +by the Android and iOS platforms). Flutter does not enforce any policy at socket level; you would be responsible for securing the connection. If the socket is owned by @@ -73,7 +73,8 @@ Then, add the network configuration to your $project_path/android/app/src/debug/ It is also possible to set the policy per domain. See the Android documentation for more information. -For iOS, you can follow [these instructions](/add-to-app/ios/project-setup/?tab=embed-using-cocoapods#set-local-network-privacy-permissions) to create a `Info-debug.plist` and put this in: +For iOS, you can follow [these instructions][] to create a `Info-debug.plist` +and put this in: ```xml NSAppTransportSecurity @@ -112,3 +113,4 @@ Relevant PRs: [PR 20218: Plumbing for setting domain network policy]: {{site.repo.engine}}/pull/20218 [Introduce per-domain policy for strict secure connections]: {{site.github}}/dart-lang/sdk/commit/d878cfbf20375befa09f9bf85f0ba2b87b319427 +[these instructions]: /add-to-app/ios/project-setup#local-network-permissions \ No newline at end of file diff --git a/sites/docs/src/data/sidenav/default.yml b/sites/docs/src/data/sidenav/default.yml index 392c650260..86951c92c4 100644 --- a/sites/docs/src/data/sidenav/default.yml +++ b/sites/docs/src/data/sidenav/default.yml @@ -618,6 +618,13 @@ permalink: /add-to-app/ios/project-setup - title: Add a single Flutter screen permalink: /add-to-app/ios/add-flutter-screen + - title: Add to an macOS app + permalink: /add-to-app/macos + children: + - title: Set up macOS project + permalink: /add-to-app/macos/project-setup + - title: Add a single Flutter screen + permalink: /add-to-app/macos/add-flutter-screen - title: Add to a web app permalink: /platform-integration/web/embedding-flutter-web - title: Debug embedded Flutter module diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/build-phase-run-script.png b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/build-phase-run-script.png new file mode 100644 index 0000000000000000000000000000000000000000..7befb124238863b24ac2d9245a5bb33a2d68c515 GIT binary patch literal 84785 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%0AMeYgfV6TC@S-NV4r(7y*R5{c zORAc^Vb5#m^M+4fl48v@M*^S|!p6+DnGYs~4bU)cspr>`$qJ`{gI!uhsgJ(wQbf`y zq-lM4tOKf3_Y(&}t;u-`%BR=FEJw5~x$942CK(Xoyqg{0!2T!wE_5uu2d1P6bgVV| z1~8|IGv%-iNCJHNfa~OKZOov0&XHf{aXsd4G78?(heMf!h@l%mY+mpE-mB=hcY!G5 z|BokzniD`v#8XDJ^A=}}me?TawkO5DR09%n2mL`xdClYJ9(!=Nn@`B)=NMl}0BtZ9 zMPpT_xN?G|T(iP6c?&8Tuv1I|?YyKkz>mt+0$fHdl%a%xNsB$HrY%p0;&#o4{HwGa zQo}5y;*mhtcHB1%T0~%Hh74jTRW8S@YzggV?B}#+9dvonX0^z4yUIpIsGR!?h9}_$ z2QELsoJ1*Pl>bC@{}90Z*fmF@Y$05*V>QSb1X21$rp#YgpvoSrR>B`Ue6=%-X0c#IXC@CrwJl9dP@3vX^H7$J^&9w_$ zVSNOtGn64LZ$AnzWR7yS2N|(`Mapc==KSl(gjsd28W&eKJLdA=&81A5GQ^noVUx2X z>&nf(408_@WS3ga@7(|B=>|z2v^VR4T)BG}hqR>y`h%E32ZyvQI*-p>yk;GeFzNXk zmo3e7Z83STIW42~xQF_8vi#k);)KQi#JmMxnY!o&Pk~3IiqT|R@9A%5XHJ8MyiWOO z?1z#86@7EDt8h5CZ^QvG_20xms(n%{yp1%MPtM}Qt&aFAZqmz`3s~H_&#mvR zG?htm?wpFc-er@L$#67H9SCS_1WT#L$IIYRgdVHk7nOqHR5Ub6Zip;xF|7Kzzd72K zjgY;2LPz6^%AxkE>Z!)1GgTgmu-Qu$-rV9U4tIvj*8Uk%nJ;eoIU|d|3-wd2d`S4? zYrvGOPUm4sTl>I!Dze#Y@#)m>yxelaLJ1=B%9jvj7{`JGSLS(lPA7mu^&O0<6Y7*; z>^yx|fNS$ywBRR{`4+>{Hsn{F4*B=wwP)Cq;;0a87b?)o*A?hF=e=Y3AT*$(ZC%^_ z&>q0jU{PB#e*kf%c9;GIS+1*oF@aW!fR>Mm@=hxE>Yu;3@hYna?$)$)OPbp>lN1jejL-}_RfFd_o(kX?-$3)0#hMyTKF-`nb~z8mNC8j z!Nwzu@t@2+gA%12YW0>@9OYF`SV-Y1H4y|Z9cSB|@9DhlZ}4b((!AxP^B^ukU%(hp+sZSsWNFVB3Q4Z^vit)3 zf{6qnw(bXYrI%zhT@@$f&b7uE2XPk~8VZdcoKBjHlA~K3YQ?2hv#2V?prij1ZDH>!65}KORoUd^@lvL;@zd_%g(~SPO7Q2g-fLay+Tas^1J)5t A;s5{u literal 0 HcmV?d00001 diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutter-build-mode.png b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutter-build-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..6edbf8df9438f610ee3a01a83764c95029420873 GIT binary patch literal 14051 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

(jce(e&@R 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 HAOIcXyX>*xkFk z&v$>^d7hfC>8f+8yQ=$~^S-C%r;5@?3^Zai004j?CoBC0c6@=A6cl9GH_M$EBLIL_ zZXqS5A}1w9sp4p7W?^j#0LcDKOa`jN&*A%>yu9oMCt>de5r;eb1HMRN;x6L8E)g=ffp~lpp8@0LiOWuDB_uf#uJg@4)us3pp3znic4{@U!NXcUYH^9#>f-^M#L>Q31l&hEt6fsE%|~}0Oi#0B_sEuZvpIi3dwn> zd5dCQKUG0OU1#x;T?+R>p&q&A$N+!vh8!+j4q={)8NL`!l+@XWIUQE)pPxT;`0MKE z`~{dg>l+2!%c^9BL8D*fGkQ9DBa{0#&)#l<>XYTD+#q3ql-^Gw#g95El-^ACy@E{RpJa4+XlNQfy0&)cRcuM>&NQICOe*!*;g~^AtzjvHg7X8 z>dogk1?4-PxJm5h4vr~hTj&57+Z`j`9gb=OJ;0B`2;OiNtCc&Lg?^Or z^iy(qLipQwu2j;?B-B(r&J{<#iRt-iIKQ95!ar!27gJj!umd?v;@RMgjtu~-=G+az z-z(;k;Z(YYXCwc~7LWpj7Vo$$rW0(|h2U5z;bg>t`{F=C0Im_7wLgMA9C;@Y(a#7Q z^K0kZPM{nmhHRH(HL*3oJqKV7Y!PSr4S0}X6F`ji)3ArnfFtO9H-=yv@L&W$58N@r zYem?=MqHy}mJXbx(jP$K3bm%<+eE$-mr!BEL+F+G8A})^QI;E}0;h(OD4D22cFFBb zDukdP;E~%hM#%%;79!e(qTs(*&1a3S+hv`C00gg{eigtmKsN7gKGkSKtPH>cvz-#% zqIuzx`(<~VpokBkApDbJ#pYWNMx^;83r{UGO?@ZJ`6ZZ#`bd_*k&H;(fRch!03D;d zN6Sc$<2eNdouU@K7QYrrHN2#^&S=!Q(gc|^Kcz~GS>ugW^p8HrKmTT>4;`(^8wfoC z3y~r*Z9mES+Pl~6(MjLzgkALauEsf(+3VVSIw&?xG#M;n+oH$xmu-xkRo)tbu(E$b zyHC0(da}VcYoTWpDBl9!cO|XLhtY+h3I=_Z6v+)7`{*V~$iR#f6*k&ql;_tJ*A%6t zXw6_igNfTO2cg9uOvF?AL~lcx7)va-BllFm|BXvK`%v0I9RJr$y!=4uAi-eZW(?lD zaH8IbnlS2o>%vJDCDr3E%PJ*mCZ#~$q%^suPZjxDg`x#MDmhGA%=YgP(GKt+csh9Z zcm~XG-$mgGhRfsCzKeJl!)&1Hl`E~rrE&gcovA{dSyiagS=T}#wa7Z3v^=AzRi@eC zF790QU2FKC@R)FMI!)6Kh;||su_Skn`@h?|s5;Ae_jwMokLLfHFTZ)fJz=+{i7HH|@!*$cx3BtJAI% zKd)G?ysz+s;tKDIY`H_%{12p+LTUV zz2QOWbV@^XLw19-XUw(s5rGgo8CK@EOzKR`OdS2R%JfRvM%kN$W9}m6_-+N$Bn~L& z$E&)_$E$B1i5^QH8~3bFC{LtM^iM!!T7(9P0Eu4`#a+L1E7w5XQy~~3H<4iMXJJc19cO!Hm{_}cYnpyqouVcj<^WbJLO2A%dguDbC0dE+V5 ztEu^Ap{c*~_w7;PihhdGiY+5ny4U@s`o{2 zUq5TqbmZM=MV9bp=?TQC!kNt8AMT7!u#eYjgXT%v1zd}-_RGE zO1@-h#YQx;0CG910D&wj`WsdZFT8K~v>2AzK-3oCNw5kJ<)8J+D%q#r_>KJ?h&?ZW^4w3ZpYt7(Ur(6y;s+R z=z8#Ak`TPpq_{~X7%p3n>UG)}+W2^9@VNB21CJ%~%Sd{cnH5h|&R&sG!7Xh!t%=)# zc2J~5U@v$;UX9r!@i1HO*P|$%Kq38>uBDo#Dlrw?`=cf;nG9;tNd@0 zcs=rL@y_g>ulkN<+Z2fgR^?iGiQb!vD8q&3Q6v51ziU@M2Uh&Cd2EwRb)#K&e|sO=QFuVOvRJrJtLmQS z+!s?l^;U{TF{_u2{ek_;>{+oXvM~V_`&IdiA#2-pP-kw&9vGs4LqZQ2y9-@e)q-wmhucyo})fX&xe!?6NFI;(guM zjI{F?3e4(o>$(BYy;qtkiKrw{)^luke&l*^Ja`w%!lrpt#rI)9$l|eAAbheqndL9NzR}=Q?iz!4=UpYgw`FVc%f7?d;*;;m^|@ zRsuPm*rbQnRr;QtA_67?1F#KPC5q>DO_`FIn#B8IgiS|s}3C-0%)xa4R8m!_RY z1d1<8;`82J^qKkuYfB7bnAQrqF7D6P{FwhS)KJdQ+p}#e>OMWK(P`NwIyh3qEBV^? z(fb*Ag;h^6N6{iGc68G)OSPeq@NyaqTPraIFZAKd0A)LnO18ga=ev0do2P z;s+8B!NIB`R|Vp#Cw_A9FF%X#kL4sDqAalh)Jh20)#QH6YPDl_T=y)9Q)}dahT8a; zy=T`N&1`J4%Zln#u6aT6C+9woQ>@hejhDC^G2YmZPwCGDVqXwvAIlVqVd1NWsg|6X zq9TA9R!0HAg<1d*VKq2dA%+zI03j{}0E8Xi!isbb{C~H;|8dgsPOB9PFrS z;%I7W>-62uIRi<@9j0p9LQTtAOHo0{#Lniu@i)7#rtjTs>|aFyAU7dc)yCA>n9|M0 z+SWmMc6L`+*Y~d6@9iAT**OIT1=%^c*txjaU_IEJ+-;qW-PmlMX#P{l z|Is6D>SW?*Vef2VXG{62*Z8a54`&f->eqq(`}3dIY3gS2KO@;X{nu^5Zjk-8g`M*~ z2m62PhKYh+&kCtnxS3jOOIz5$rUy2LC?_u$=s)`ZUoHPL;{TG=`X5OyUf%yL`M+BJ z|B~uXrjAl}Hn1U`MgM1I{!93OH~yC(i2e1>|JO|X=QRJvS=c;_qJh}|d(A}AEDWrd z000hUIcW(sH@KrE)WycB6yWK^Li*uP3A%!sAi`9I+&|ygNST$X2mgXyc;#mmZ#_qEf~ z&fn1=qu!$@X@w5n2V0`C-h7BMajAo9bWHG{?yD|{GM%_w=AnjP;1;N zT8T^iIvon}hxkX6en(R#s@|KqUUX*J!17?PF!N~38Uh7XfDIiBmaE2L?O0|!OOT!O zcFkF%a)GlqjXqU4RjGDj?#T}8J{BEBGxmuH@nE>977G{tp=IS1vy6rvGa(!3dVS)@ z*|{&e#EOmEPMd;tr`dN$=@aHY&QABwRbTFVvy%!Ak_+ps-9PbHXt7nK5If#&<<79F zzEkU8?yhE>fY&cZ`~BPZi7oSQW&385bIX*SoU7JGk~36zG48lyI{b3?O0!@G^u07M zu`dq6Msm6&X9>*rlm;EQ{>z(9v!Zm|_9*pTKbiF|;@2^8N1=Rj(Uhj4NL;FM;b|BT zwaQ)VJSDErN{6kx&|w6BG4zGDF#F|sT7hOwef{rz0(H|<_~oo8o3h>Fd0*Xfrp8Yl zWd%Au|i!mAD?5*TdW6gjq^Ic z>fh~qb+ujHWr&cgUY3jdfTBgmh@I_Oh0>c|e~I97)my%sxu(R&@AAc$C(bK)t0)9$ zo%L)A6C+NBA}{0=EmYpOkg189^tqG7Pne4?QSU7JqijEY6xk~pZ(e4n1R}pHw_RI! zy#LW1&`|BvMGUqUsNPPq+BQu6n7(>(!t}_V_4bjwy~RW4Pb-?w;Mlp(;N)Vb6S=*K zI)F|U|JFw(_W-|rq{^_-NJ{tiG<~FAvD(gaVZjV(>@r??Z~97grHg=F-dyqOR{gZ4 zBkP@Ne8$eBeUx+0OlX$aQC1i8zUR`9nGxL)`P}bj^V>6n6(jl{iyJcvzGFMG#cb@K z%q$tRZQI?qRqBY^^G{z+XIRFWR?^bCs)~FJPqstSlL{s(wP>Dp8>b}qBaEF$f6tBW zP`4<#+n;O}ldg#!)~o7Mx4mQ0C@>vLs^HoD&Z693Y54+O=E3K_Ct3PYe_8YKy`pQ& zlVK2Kr+Y=YLRNI!ioclR*`u|c!r&ovY9cq8Rq@2rgY3oCGH2sZNn9v(hYFr7t4(rjt}Wy`#E9Xj->gQoK-(|5mc#rEMFz2kDoj*?oTmg3p%Y_X338)?<}Q6KirSpxo$Tm z7gH!;$X$!P6ghXjZPjG>44@cbUj@!u!|g7D9ig^@cYIq zfzEm^d)a+B$y^s5_O2T{ygk-&vr{lZr=8IvhRMt^^_u)^yK1LO4yUK}Ro*u9X6ZIu zSjqxxL6>(>Ur{orVb0W0WuNo-393-iai+P$_eY-}|C+wtV>fIEeFi9o-`A%-8Qu?u zmz-`;J<1n-^K4${*)2a|RhBOfzn#;cQBVf`m`ji(%%=|Z{E&eW>*_Tu_6vC50idli8~b|=$yxo&mn(R1Zt*_nuM(Z2f-`c}(Y z%CDwNS+gl7ooiXM<9^DykI1}0*=rp)HI#l5Q{-~2ZX;T_C=gSKQMr0;tzYc<%=z)G ze}~HN_UwSBB{x9&-c)-iNQ;FLoaj?gamlY*bkH+*fVe}O&*0G$>bV^6dF{D$V4#1Od)B@y!wxaCp7F!oos$#rP^Vj8 zTVpXe3&#V2t|nD+3rj;^zy$5Fp~~anZi4pH;JsOs7=5Na?DnS0O~Fp7o*1jf-(YN? z89vLz6h7`2wsXm*r}LP`f{)pCtV?!Bx-8CDc13vLNlkx;T!)QphrRZP;{^iGlnQzP z%Mt_*EY&Gbehiyyix`n>S>NZ2?2D84uFXSru_7Bp&;iKxG@jY=kGBJ&7H|;}frQP8RR0Db3=in-yOVRx8Qh za^Rn2d98~aEi2K~Mte9rCZ}V1Z|0L<^F5h`_J&`oirAsDq$W6kiPfo1%M zZ@I`G4-nX@?KzSJ#YHIMgsgfLD|_#&?%~9^N#D10JhW8Gy}7}9ImOcNR`^@oC-$2% z35338i~-uD!bCT!Sykg4KBG{4)V$#HGA(KuC>#SduWdk!YFY3; z1{r`)xR-x@Bv19Z8~R#43GR7$T6s}q$o4vC=G>-G%Tc%{`!V^MfYG`Co=X;f@E{%bXFT|0tb({z#KnlA1P0l9sb>H&`)BSEtadxHhTKsY>V8 z;l&`GT`|N!Rm_aLi9415p2b#^>j$Md@iZ&4O*1e?$o+JI_|ksKZ3)C}G+=SQsc6+2c8$*g4DYA6 z9`UtMoG{|)u7KIUiqx5eqh5_gf0rs-{6U&1-Y6vuA;5$0h|`5V>83di4<34&B$}lQ zrJeqFU*HQnx%PfpJ)-!OuO9T=a7CG=_gFAwLgICy#Et??z+V(lgu`XXQ+tx?&WRD*1%;Sxs zbYC?I0Jpyk2qzY8pmiwWlzMK7Z*{J(iobjAJtMbbV+JB`!|MLp8Z>H{teBYStdG8r z8x$Ah_C~S!MPiR@SbM|VP=%GpZT^p$m*wLRd&<6P2aoA1k7gQslLLte8$JF+wNLzu z_EH`X3oBX2&c(uoucn?Gf|fYhg`}cz?Aq}#a!S#&#vpbl_jkXvY`l-eE`x8@DDZM& z<(W@Rw+X-l_aUuq!nJjS%=|E(oHlzd~nqitZ5Sa{`blsm{!`GE9(2euT={Rw02 zK4%e$A>2WyTkO8>9?KV5$rr!qS^VEo``V9qp0v6CU06C!dICPt)Zv8ah(jf~^^JhA#J?N{9Tjz*YQQ z+mlvYQ2oGlErzz4A%p9h!(oM~pDZK_rS6xK_Ar2CW4#TR{e1e_gZuOluFnMpYa)G?FcL9C$p=xqAgY)<6eqM>1!HFA zgsSXTs}zX8E$J@PW8aWRiPNYcLrkU#A?0V0bef1OO9DeL2Mx?}c#&<0s2LA&Sr-{Qn|-o=WJnb==OV2IvSrRrb|Lyw)7`00SmCEZeWZa0rpfwzA_*$U zw!iPLsK(vExLL99Ag`v*A{VVgw&RZUSoo+;RRhqDrUEiH3-#@>YT@g?m6VLdk?BQa z8kDB98carloN7ZoG_n|G9f#N^^2x7$>$#wHx@Di21sFP3Eki>PyaU}i1bMA-wQPC{ zOtTIub^_4pHYq-Z(RGd#=oLc^9}`*nCIgcqR4_?24bJ)Jc2+;oiv;6^8r2jjiCj%C zmZ|d56Kj7_j0?GoHy}J5al2}E%pm}Jq&@u-zpOi3Y~5emj?4QPrEHYt&2mC}3!xsi z4szvl*i!!Poh3!0pqS#K`+Ji9cD*D}F!56&LjJb+ipa}vZgM`6?J6P%D>UR(HB!Eg zxgHZ#&Yjc;2nm`(+T&#KIO&bYa0rn1_}0;AJ;>KfTU%a3kVBg^g>#KxySJ*ag7h~j zVG@G+ZRnO>l%^oZ8tHGa*cy8^eutxx7N*)7MUoS*!B%IGQx4ioP)DcEBgEfWP$k$` zYjnyj5dnA9pZO8@8Q$uQ1sJjg^H;`#nj7kv3If2=Q{~$?<-Jw^FXae*2wrH7M&l@@ z_JDLHow)}l_D%DYs4{9cw6#!P>=f6tw>HH{Vtm=O9igI^xhzjEu*gm?2muRZ|A8po zH1HasjUUCOOL+M#I`R#+?UMlv2=+VA8i!WkJ&s9XDfUzNK7O(t2{j`UeVBt5O(+Rh z5S3T$@ORve>@A)6xI(L6?L4=$JJgQ`WvrY6uMp~e>_j8$ejcZV2gX7p4WZ0Vq|LO_OSuPfb-=)WZO8I3 zH;O&Sio|-`S(M#y6WkiUra4Yn?VMTqmX~;SW8#|F^M+U)Iq5W|+f{WDpjk+|M`ar* zb}NBTS#5H=7~<^J2?yM~my-gS(@{h(3*`p` z{megi{S4ZSe1)`^b}!dr*@pm6ogas740FP0J-)?k+#BcdEd%|$3PZ|0-RDTVe|H)`u^ia`^(`Z2?QuW-{ zf{6xHY0%XSqr72H)`$ZQ`=h-m7#5$CD@|yMmpy7D$M{_4PjL2=PUs+SAqc@s5T=yX zP<6u*MyiBl2vVLz6pQPvk(GXoXEc>m+J!;Bm!M>btriU?odQ#uiNI#8)OZ(=BExuS z?Sl^tkq-=hM(kAIk{WCxCZ>X*+%g%!fsPt|AiZG8gbakQlTkHXY7>~~EP)+(@N_tz z7(Ql-eOTehazwT*E2f@5PAle7R8P3aB0O;jcRzAZ-`?*RCXQgF`<}9G9c_- z-E%7QX5I1zi$QpX6S>A_Q3F4efRx}Q_p3+v7KX)TIdR?q$4T1w2*mNR!D@_a<5p#rBM&dM{uW1R zT{%`^{2V?Gg(oe|U+r}icLN`lbTwDk6Vl&0{{T-EOpMD_iPt^?L{bA4`Y1&(&_$}} z3W=5xX{NrbblU8t^3ZeW4a{;J*Gh$oi8%8QcRQjRF1yOw(wVF5IiR4a5`hTi;d|Uk z1ihrOiWp4S`*FSxo1Yqs%j8lePs{2GEoKb#gd5@P^-|n4^(#UXs%l4t1c|AB87#PU z^e_d*%;JZb2IWO7sm|MXW7Lx57AFKkJZd+Ii zvEiUg6N(2dA3Earte(PCdD|$ely>FT!dC$TZGx$mE)jhQt!)Mwn3=no(S z2M>hL9`g0p<~c`g8qeSOZLd*#XY6XzMs&Ic-v}3`uGmQkFPDNynknJVj{1k&{yVzK znyY@e`1DtLEv=(Zg$ova5#zVSUiW8qNvW?+!HRGNZz<_+1g!q>RTV=`u=-YD>@S!dUyrqY zf0|ewv)qGJ%XR68E{neTgYMiHG8Q1d7_fA%<95ZN!gx!Z1?CtVYYK%lFj;+I-qrB& zq-na^F((nG@4tKNm_HEs*6$RBBxTNH?rR=Tr>8GkmL?(`kyg)ijeh8`Eu$(sZM?8E z()2t9B5e~2#1rQ_=3rs&y4CgWM$WrLe=16Q^5&@3j5TtuvY&!E@^-f&&XbC9eX+{yx%i?CbFvR?a|=t&D+m2F1^G{;oSD7k%jM~GUuw`IC3QfN9b_y z!rD4TTB0KEnWPxDOMy8`@|WxuyfqtM}F0m~{K^MAK$iespN!~aFY$ou`nsKr=`p5q|h zoiz}u7))|ht^M=|_t^|?W6qeMIK%N%Upm4+3}4JWx@ONaapv5H(!*E23JIfc=@m?x zH@dbR=r<=LKB7Re3a%2<}s(0snx2onO@3PwP88ECh**6 zwwpX@?eC;K^kjg0Q^Wz+CqIfWO+$9P83yeg?LOZ9j8Rt1;u&g6$-25m)c2IM2U3w) zJdE&7mMnAI1SwGwjOnvK!6KTlM!Qxji!0X+jiw5X`7xqGZ+_C$q(~~50qp@0 z=jTiV)Y2-0l+}Ddh}_Ugt~DAOqc+9kro~l1V$_I9K;9}8jZ+Pydco(7!_kz(4Xu_bfScQbsxkzdr6Z3 z(&0!=Gm9TIXb5%)hY61PYK0O+-TnNm_8u`-q_sspZqXp>u{KszmWkgE4&WvL|EXrtuFLwnpf?>sPF0*?9?fU4n`7uQm%J zpqCb%N&>OBshJkzdA)?DBxMXQ#^dth>kKR<0s4lM#UXir#L&TY(xkak!~e^-;GMDF zSqPU|NSTSMoDA_g-@zD@;uh9(^&+^`qK|#(Pw8TMWBkPA>$#O_cT zmIx)?l9G(^p4X$6lXc@6Q>xL^0t`b6S0}sd5t}`1nMJ$dqO{tW#KL3OV;i}uc@hR& z(X;YwL4$Dk|0q~yPlu(mDV7OuK0fRgmo~Z-KLuqKa|~YzV1F@W!3~TDHWT-VV6_JoAwzmp2t&<3JmU@vVR_Bzp=WBm91)a@;d zv>n7D*vob`9x%b|i$%o(ms)Ey&+&nM^EyE&KgksXnSQop<%0f(r)TjD_n|Oc5ddr`!IkUTk!DJ`4tIRnW7za}F{S5L?N-Z-&71l9o(q!@*)qb% zM#M+05zW{BE23uPao-`%x6kn~5K083Usqiju++sZg<;Z^SN79FV=^7$um0+7H7joP zt#k!BMqq$*qWm|1B0?EH%$HW_oU}|gI2xtFx)f`Fwqpiru)+Ll_RbBN8-i0}h2ndP z$5r5khn>}V#ff1g;)D28ND0khP>k0mO)8rPK5~|Lyz-(A@tbha+BRH3D#pkU;oV|u zn0H?rN9k_8EMy-U()yUP>HH{!<++_PXj%ib$S(M@Py+O8qH z)D2^Pd~&ozT%$akg^@ABG_sC`w1;uE8%M8TN0>zO{P0x#7PaLGRiYXjLe9R}zlU~! zld-_@?V#*v%_d#{Zy|v@jFYWW#Oti)nK{Z?aa3PBNmivn0fu%?%eP>;u6WQhjP;qNKy=RiABe0F#E7BsL)*4TJHLa+ZBiI zETtbrzXGG4tc}~<&;$^X;qho@y0OGS4_%yf>hlfrnyu^a-0!%s!u$BX>v{>Nj)L_) z_6p~y;dqhg23-t-fUiVc-%kAXYtHI$c}RH)pxs$5)xf)8X!AK$Wuke%z=gM+Mt%ri*A&9F3u}`of5jf*^^xzt-JMajjt_`!4g!T&bG;ZC8 z4W(mI+M8^^2?&Z$IO0uj_R&dBa{@6T23c#!;sSY~SNQF`ooar48R!r2rE0Ju*;a{z z^hNrfc&?;R03(|&t~f|&NJce020Da$hLKny86UQEt629M>gbFv*zPJg-;C7VrXqhF{W@Xa#j(-6r z4gO@vN|E5}wQ2~IwQ8?Yzuoz{(Kqc;R3njSGU_O$;^*{z*h8(2WkL0_OQcG*t8B+zPgz2UB^7CvWtec}ax- zr*Eo;`^qr)`lk-`oh%aCJi@fNRjrt!&?y#T$xHbV;<5OyQva{{o1HdD zZ7)wJ&{@B}Nrh(tJ3rraiU}emlVNQX26F2UDWU7q#HTNveoTQ@f+b7_@jcwy%&nl# z&fEqNO{F8DS(wzUHkn)Bm$3!aq|rbXQH_b}Bg%7& z*<)bB-7DYf0n4{%pWzQV{x}!DT@AcQj@)*2Y5NO;@N7<0EPjsORu_?H{G;Tabf!gS zGqz6;^j`W&wOoCaGi;@H^KRHgE#uKji0YPn!=U@pyW^1aVNj#0kO8#nhfuUu7L~fd zsN%8k2#&H(h9^I+RJ_@xqd}J$qrZJ*3NzRWUy~`=f$UQfo?F5;{y=9?+rGyqFq~_s z8Xw*?wBBIYxk*KT{S|K4BcU;<{g^*fht;{6Bf}FfyK#Bs`SyBhrTe?gTNLkM$R_*(dEwXb%#9)a`Ba|VsL^#S)aI@7?s>K6(V*-! zCUzw#w%Lv@`JH3?geqcCc6EPKl7(IJ@@pQjaVCwX8Y4M&9zp!`EcQCBv54p@>dJ#Y z+dCVYAvv4qTm^KjL*xP#R;@pq@3imwB&+QQxHMX>AccPsSNcfSm=a;vqeVFVPJm{a z7!hBdlwp+kOfj2UEe5vHh!g5P0EMSmFk>4-T`P`dH43L|w)s(J>(uRkUt$;JRX-L~ zZ8__*f%A65r!BjpJPY-&xuhgf*hbTt#GsA?ylF*~F;Xv;@|%cZ?peWN(xjrkl19Xb ze2S;<$BB*09tW+u?B`F(zIVxs3-bK<!&oA2<2=zM@R1rt>Xz{Z>hSt$k;>O2ZE2sg3 zAdxbnXXBu3xvEBVuw6n*>}>Vm$QlcpAy3p=Dk+uXB{z-E z5-SyVDBJYDZk005pSS23j2If&y#zxUWrGxY8823_XZIY`Hz4-RvP&aTcf52Tu{KG04owQB7*I%vIe=}3C&!bWDM`hcfLWm zYd`O4YIM;qB(5g(+N zag-2BH>YgY#g9tUi!uh@VGoGo?I)s>$S-!@%?Tn5`eEv<0%uNF@_OY$!+pa+2#9PZNMo1X-=<6s1Kj11Tbwn{x6?_kWT_jnxI4yQi-Vg*CtB7n(i03{86s(-S9s$4k&&NLwY$ zJNmIK?c|g?nSukwag~6M*eIGUXXs>UJG(#TIf0x5Yv~%Jf`rrqxoH~HoE_M<6DQ#bb9WX|n6EM2P?{sSEGWtn zCen>!9R6oYAw;g-hzGjFa_0%#khYTbp+)om@mBa6a&ZB%-+HoDjh*u_#p@5nK?X(>@28OD z3~bJPNQjpaO$ZJawb}5BkMJ;RK~6VEm@A8|sQQe) z4P&WJlq)WbH}H30?J&r-`JtOo-*a87;DQ}a=Cs}uEhzF{J~t|Z(BwNDMQ5d$6xz3b zaw;x0zh*-n8k;?PljFC{X6=7!d7qSWWs`;C&(H%;mgOzow-Bqkzq&f90oedrsP>B)qMb zo7%WDezcn(GukG~Z{|=;<~hQZU@_3Ip}%o0AgrPTko0^eGEt z)`s7BFwpoQv}0R4ZRa@AqUGb~>kg3Owy*v|hxp0JY-TF4c~fGq5l#ZV^+oeUbTe0! z&+&rGp-ih;*4pxsC1!wyXrvM0GtAb8F!gTF`8^%dvkviFKeduvP<2n{5Bn~j!2Ie1 zN$FPlHlSQAKDymng-dio@SW?QH+wt?AG}n9eS6R=21j5v&KCUdv?==TV|RZV1ms8= zf_#y(l{Z|9_LApSQUB$2Hx!IH=Z~=rgZRq~`o93n_6xDD>Z&@YszVgyBwiyCAVEMtyq1y_{R9C4qX+D-BESLviB$;fAs~>7%|%2M zq(nqW73^(H%q@)}AS6Q)lHe8M=5TzDpPzRF6VY}92tq-=5TArmzmpPK2E6_7jttH( zlt@FnqlT0mYQV3U4OT6$kCqn4GR#M399Bd5mt%!~*O`|-Leu?L3+M6BBKL3aCx=n~ z>!B9bZKw}<=Wk<`)e(Kz?DE-ujmF^+?gE0`vWnp#d^^{rFd@I=WjmSR2%<-boQltB(xZhainsY{X=*k? z7=v{5{q7_cGJ;1VpQY2f+j_#2z#FF+n|w7%Qe-Y+EN=^&6P``EpXze+2J&b0v;1S< zUZSRtnGJi%OQFVBad~;2u!X_IJ;kNHJ&*ck;`LSSfXy`bt6hOc`#DNHSSp=_Z5WYU zuOaGP+#7-6&R3b`=85@112eMGZg%;})am^~i5O&c)QAmdH*->}ij!%Sp=nH`43zY? zyrjCR2n31JN6i~wcouy#4G=8 zeXM5abu^e&GFnmpUt~Ic2rNOCWE>lCw;zNQ-eE!a2!%xB#R?T=MJPZjBP0kXC=gw+ zf(Ut_b^P42n#M@kpjy5PbRfw1?v`^{zS8Qj{00r*xq4#2g{}){+SPEPS`Sm|huX<- zf`5bLfl2I>*=30Ep$`FiT!bEtV=WMdqCygiTx^>BR+9NsARGCiB(6OX{s&!B5@xPf zue-X{^|jwWeM5LfQuV3|rwUdnw6LdIf8=wiAslngw=#8FRb-1u$6ou2@mbLWdrRV4 zJa>qNaQ>*45Tf4Ju2tJtgvi^$=ir`|Si2%yEn9ax+4{+P-9eABR|HD#1-ja%3wt900UwEEdMbH7hybVTJ(tEk#7BLpZeJP z2z6OYYF!ExOt93zTb%v`EV++VR-_5h1X9~lkGY&iEE<^yqPib&VrJr``-1v$`~5ef zu&_h%d%`M%$#X38eksT)9er9>C{#B53D2IGBDM6fBqt+JAlFObJB>Q6EjA3&KGp!1 zCe|I6E-eOj1QvIwG*%UM7GvOxlD4tWe#C+T7I)w zgYIqYnG$w$XhmpL=m$zQ%* zR?WD1*&6vh8Ap;!tV^Q3l08(m_XH*c$ZUxg2a{Z7r^0ciyV?CSLoPe(~d*GVZ&EtRa3ypBI&&8Lm)k}*zv zKguj|S$*+vY2=pRw&b>cNB@ZMNcc$g2oLubx>m?fC`PED<40EMDqq*s*VkXK!-K^w zbKd4GiR*|TM`-ja_NInwMPyd~QrA}HDDs`M5oWjJ)G+yEY~O`tI=~^zyks$N2$wpS zN|~IHtiu{KOf)36X;zL`ZKMvTv87(C*;>s~9a=O0 zdCK^5YJQn#s&W3VH6m2jM>bNnY1l%GRjbu1`S3OG&-Ah-o+geaHHV>XgzbY=2XKao z;HX!eXTc*byaarqNKRL9PL^SsVZ*u=M>v0u#9ltzW$O4KZ^XV&O!ItBjLWLsomoOlKo!Y`POJk@mJIJIoW0tY(vrZ=@G_vlpUmBAyDJ$+&^jxonM z%{fRpaM>l_=SW#7rTr0k^B zv)aAw=P%^i4eXOvrgcj=$kdK`5TNABquSK^qWndPfQ*6huwGp(ja(q9G_IArMa_V* zKkgO1gKn+G+z&PdH&W;U^|bLsDT&maA{NX!=gJQHy5h=W)Io|Q5}mAO;pVlyk5vh& zY6AUN!%ybeCfMF8+h1Cy-l(FMt`-++BbP+zEi{bi>l`(%UV80Ya7J_FTHdgOc?#Zd zANKx;IBb}2*mnqOJ-;s{lP8l;adwXz%nv-R7SI}O_dn^|{K zr~TBi6%k5z0%BC!6~9KE(O~a>4wV z$2&4amV@RA7zpT6@nm6xIzG>>nhJs+J@zG6Vn%Wfaw5RtkqMlWDd$?>6B8J6N~B7l zt(dJ^z|fJ-wN2HW&jz>B!-y@I#?&hE*88N68%`d)37%gLsy8meSVK&|@+3Je3%>EZ z>TQ7CZXAWrXmjbf?wn(kn<)${#g*5#Zv{QD+}rPC2hlO89hPxCe|ffWs1tD>WCvSV z@yqcawm7)+-YwpbXkWK_t-@XRCZwL*TrG#zJ8oZPFF-rPIA<)&w%qUOPPd%i@84HE z-lE16V+sCpQ@>2zwULEJfu@FUfiDw4atC<_3tl{2hyNBt-4@6fVD!qq&pj$UoW!JP zrQjdM5qRUp=qm6;evG;)IG~r(%y(4)&Qz1gkqFY0((`n0*^IbLO{sHOc8UxP=l4ju zvVQPon$)HgKoR>mcGA|?TkC4(t?B`vK5AcD6@e0 z-V5KIC_k+^0j}+8%NWtBal+b;|7gPvxIcT(UVjo)NsxcduJ35%DRbq(R zs<^1#C+AAFOf;g4lJXOldF~I7pkB8V)a1SO=h$mO_GpR6)F)iQPcX9&MKT3I_^N8G zE@dJs3qcF)BS1g~nM1$;dyv3~0Qf*aK*xTCfCs)YfRE^RsQ*3-qxT*9zxN?lUoI3< z5|NSuzLgB^jg74x%xpl_&fhM9Tg{j&tAo^KWq1s2tQbEV*%%lzx>(u1G=boA;Q@B7 zj6t7CU92pv9e7;$$^W^62iSi(%tTK5&m|xWesXnL1yT_kdt*`##`lcx$pw%|NlE$a zjZAnxiHiTLIq-|0+zbS=+MC;g%x$bmU+(+az{U~8Pfq^wp#S;%uYMZ4nE&sStR4RKTEGi3 zy_{iUW_-`|KlcWj^1U48Q80Hgw$u;F3Qzfb%>E!F?GB{MTK z_y2ABe@^|`RK>yAUc|-LP|dU^H#BZ~i$^FK!cK?@-9G5yb= z2_R);W7$AJe1MP=6;gJAJV-}uj-Px6w_Pt^Dbr5mTfZ@;)0mfA!F9mSHAptrl=}#SF)h zR>g4RH8h%xuaD?6c|l=Njp{QVhtuiDlRB+N;FK_a(yg5grh%H4>6)^d*2KAr<*M`` zP%+0*V`1yG`$cN%$Y_!Fc8O=MoAvFCo}1fOink`;AW6xEeL5^O9r3Yt_H|6r_jy#4 zYp?ev8IeC7m5y5c*&kBhHR<+XCiQq>5RI?c&nnvCk*^8uM|jT0VQ4?{!yIy3aE|-r zRf5?Q`I(wBe$Vo#Sru3<-kOyeAGL;tl4hNcH8gGGAI}ey>OQWiWW*?Ts&{cQSPVdzLH(mW)7aLrPQX|@mfk2G@_YKP%YWMSMo~WeDoE1*KS0^&gPNO7v zxQNsjwoQNybyK&ajPSN%pqhyYe#XgDw(0&9gJRLu?eIwJyv8Qop9oA_wZBPOavqAE zU0e4ZA7CJf0;!a-v;X+{Q!O* zc*0CnP-TsE2Ri=z>nInEDQzCOp~# z`S#{L>lfAttZE_??{)UM2rS&K3TECp&x~7Klsqn&H%0l$>}!K$(hGFADaC&~c{^!> zr)G)4bfb(+%jUshpONvJuN?ds0$`*pcq0xuQo!F}Bz^weK9CZ5QLn61*7YFc>^J(% zz;YW5SK*%TeDt3lcT0&%z+z=)erMBHL^?0<&Qj2i-uZ z68FliXa=lr7?{{~sfrzxcy2X5HW~TYj_;K<%Q~(HxG<0VwyYH|_Y{4ox!06RSSrp9&cLLGi5ulq$qBq=6rtPW66GuTyKL zq+g?E{^jG{wA;L(LG}0@frX%EBv+gNi0pRs?{(Niz1!J}CDm=KZRXcdvtC9X#M}!} zPDhLQ0zC+R!S`>;c}JNJ#Z-C{xE;3oVg(cXYD*SmerI@cshVNaDMxpq3Tp4olpRkI zo&PQLP%__YB3`H2k6-t3s{7<^$6y6h%ykZhaUTgR1OWLPZY(^m&Z8VX9abvmGgHG5 z$(M;Vz}~C5nic2l*YJvSpW*poywj+RH{xD6sUjrB zX17Sx{n~?TmAV=N2HgWDrD%XA{7m3q`mPl~jPT1hZX+IH3i&)}{5BKoNnyJitQ zyvc;1SD2V2w}GxvKK){z1S@4hf{a7|UJBc?(<;3H*_^M5%1IO#feB&0SG)dcD2-dm z>)}*F&3fnTxA${Gl)#CVf^wptv2xD`_0Y|(bg)>%LQ^xk+fnELYrEun_5E{=z8KP>8|DwTV`)y*tAYBNl7 zB^cgc8vm}#XTP%OdQiqx5Q13?3nd|NkH9XH+21b3bkpfL>)}fawU{YQNMW}~*|%D# z{i5U$5w_?VP$b!4zZtH726SDVCH>dc;R5U$@_g@?vIqs!xyrn=c4$AM@7ozl)*0&vmq-ey4Wrt1 z3y(JOQ8414UgRAqRN{>vB^faqlwT;MuA_r$NyFXvlaj0Hk?Z{Vcy*K9(P^gJ9t}SG zmw1|++wDx_gV~B~EwRO#3es+J&I&Ydl#omCd?8izJ^sXuU3rWFGBY}}h&%6Qypqvs zXP|h1`9f`af8P;YUo;X7=$v8i8$bKOcd-8gQ0 zM$uZ--=Ew|D1tfO-!E&^&G5VeLN${T?R5mUSO2E8fDS9*!O)+=b{QfPXt)GYZM33n z-X+Zqs#i}1Eismvhoj@0f+N!-FF%-XD-JxIp%(d3L~;rDM!dl_Bc)%~^*9w%az5MW z??r{janOZC7JZn=R9ArGF>RUFwH;RY0Yg|JoCzz4E_%+6BA{pbCi)!JPjYi0A7Oct>VBlq=N(*}zdfpye=7GQ(DykvqH3+AInA4& z1yY=~pTQc|S}$pCjiiTtnfNXQz5U||RH)eU^;e-1cw-KScRS4?vO!RNfb>H>-~B<= zaJ`F-?tyx5drH1yjyRMcM_k%=$L3^y!k2GkcxYXd~7HfZp3fdl`O#2AGQ?}--*RxtTZDt4k1^=&V)1*I|^v^0B6L>Fd~R1`=Jw=F`oCRUgYlj*rt}W zMlh>IxlEV;%OayrBc3mum%6?ylu-8)XDu!NSs%qjj=M8>{3z9=R1>}vvDjd1DA}-9 z3UF`U4M&>$+3msN+}E##;I#Zm&4fX|vlqY!rZ7mCYvXem)Hm;_Pk!g8AGTfOIIAE+ zezH9AQZ;QyGwzKdv4O!3_veTp;1He&xVzlvwX3DqsO(1IX(t&#PM9fD8-1&QqR0EU zMn}WgcPFJyefsrfJOggP5xtE0tUBF2&%EwZPUNIL5vIGGrDN^q#{}AmTq(?R3&#RE zQ*JGm0gVVpdL!4UnI#RrHD8El40*oOfVo6pSPGn$6CFEXZV|v|F=*AYd6Adf@;^VE z=Na^bvX~6vO-?_tTFtZhVvYlje(9#^eVBBUpN%GWmS6gnRdf*4{q4B*nY#>8!3~(U z@~s24msLcb^vxss9zOE3^Rg?rdD?_~`t4nD$0y|J_p?VPa@_U-fi95ioyUkUp@^7N zeZ0r56kS2DN2gwuU6Y}{ju{nvUPO3T>!1^!EkfkBlVv~r{AAjl_VZqaJ&}9o)iD{@ znMx79dU3m27?FJob#W4Lcg8qVRAQy^Ac3MNgOTk#rkpX)^`gUJsf^pj&Nx-;Y401N z!IUu?qm`}x`O8$V_{8IEF2v_uBItp{0F98s#STWD!~^&Zk<^@`5s*Qg-+aJ)am zzwh4>)fXbm4JuV-nN8Pp3HMl7)JblzA1enL;{aXId%9UiHJ`68Y`)to>MeuzB6~il z8cjQVU1D@|f z_ze}RAs|3mpP5PR92|_;=-FFQ#N5)=Xb31lZ&YZ%53F4HcL#dK>;QBWz=nFwdAB|0 z$)!Q{CMpgkj`ZEcy~E(HKG&9SYc&e=#V`D+`+Qgx*8*Z;>Jj$T;JD~r1LD_VS6P1 zI3&_LDU7kPFE|}d_S8o(HR27&z~b@NS8$NyLT8{Lo^;*)QHwkaD{I$6CaG8804@Rg zR_pyyT%+UufG_t#4v08h>JJ3;ofLs>46HO!@FioV-APvWQvM-nb4I@)NObBVw_J{w zwU4Byn@M^pVw7^)9c7PPcCg6H3hgb_&d;X>KJJc!51I`P8{5qfTjkrEMJ`zt_b4rA zEoWn;)$37x&8mc~ajxfE_+b$W-dQuK^Q$f8K#;3Ydybn(?gd$9?x_Qi5mQ|GDq&33 zQquCMN$UiDRK3@gEaP4ZOiSkQ`|m9$Cm)JR8wa>?+#{+jW=0TVWTVVNf3A)dsWF-I zPGV6+lTKDUY!yJN^4l`L%EHuwU|+N!WSA({VC|TuQ_m7&BVsd)u6TccT97%k?K3Tw zmYi(^|Xoj-NB?2vfrt;pbI(z)ra%6$4mcm@wJ-(`{0mr)g5yw{72yG_GMCHXyOUeLk~b9M;qR>~S|GJ}ViDUOuTssYn{Q*}(heU6+VpOcE{*Qat)agT zjBXX0HziDqWYkujA2iAo#6rA#vlgiky8|UqrOU5zaW3C$0BvOzBYuyxxye@`N2G3k z18Ye(p-`g9PO-SdzGl;U+uMqTfQd~cwE0U(K4PHmejKX#`QU06jtf9l6vD#sc5Tn3 zclry&a(Ke+_aj8aZaZWhT_{`(h|`Sa!v346gil}ELkx8x7mCn+9lz?vPIIbuJvXUJ zkY0GF7mrHFHTElN`&w#&h3emlBU0Z7Qhh64d*|bt8wsM}nb{@AY4-X0h0hwP3`MFX z_Hyop2lTnMeM8BagR-1UZ-G#f)l1!$?GTx%nRE}Cd>Y}M|1*wyJLyoSpkT9pHwQV) zlC=?I_S3AecrBreexG1~=3D)HjIHF9?}Q)?o9j>(cgA-PGY&}$hsknZeHiEY7kcNA zHs+|Pt8%I?^X=BDwl;{veZ3LL$f%HM93r;sI|ZT zTGLykxIpXQ$7;EZbMyrrCmTW0_gk(~jtl6Q_+K~i`mo*@SYzoff?Q<(fCFPN_E%#& z!n(M=-@b13q<$K6bNXFdA8pbd-Qdv13U0sJpBYUvn5fm!O6E4qzny9YLUtCTKD2dx zwrR^1Tqv!G=~A6HP8negueqjiAyt`e_ugC}d?ADk7u$Tzxo9SuM5C1d)!Q+OJ!;l? z0CKT;Vt(Ev*HuWv!n0S*w_V`=z_51uGvk-tHTE)fW8F*tjr0S{+uhA(Zy?$x&ULH! z0gb-fu$>VHfIim|+)bA#l{_rJUzo>4!?-;VHMkuSxqskE)T8g!nS+!x)qXi~3eO){9Gu{L(G>4cBa3syUt ziM;(Q-qM4aa5|X%Ob0d1l~RK28KDRZU}nt5v!|lNYFQ9N8u735>UVRUR|T}RHROuLUY%vDTRxvTZg zFEbkQjKUB$4W!7-$$>MFC&MaEy+vAn)Yx$Do7L->$UX@aH{Tl0%=!S z%D^1g&hQ{-Dcj+$KR?{xkO=$D!V$D{^(~H}`X(<&>y#D}s>2n~!^1u^cUI+KFxVF}iX=x_x!)dhIF=a&BVuhsgENfgcnk46CQPEyDS}dXRnJQJQyc-sa2muVDQX^pg4- zd}tT(I8CWRg3Jmu-X1aK_8a7>8b%P%we3`>KFKbcUql`Uz)621gI2Eh^Ai;@w|#E& z)7`$VKip8*&`VD$?bhK6wHxf)Yx|X}j-|ljf=*szURHARNn5ao{+DN>r0tVirjYCD zQQOQP3IyV=jwTCOs{RZkd|*OheSJ`zFLgnR$yS61UYAp96ZLk6Nhf}dw4`Q_3imx> zxP!p#rpBa}i|29N>!XO`TjM&>u`(bct5AnUMjtW;SfogYUm)omLG;PWd1%eqknxqXL6d3jl|-8OGF#rrrmGeC4_S&8+Y?_z^m?U$@dI#2Ypd z3lr+ffdpMUw10zJ_V4i(rdqM&t%QZ)C2Cm-ADU#+v-lph=(y~*&!BNXs=2-o%TD65 z0=YX?loaKXb3yhc0j3_K0$Ow?D^XF-_m09z^8yjb5iwxwQ4}%jEBB z^U3hzR1C_Gl7K%BU;iA;cfLK!iG$_+c$rkuoy_MN3otrRzIkE*)0eB$xNA7u=wqia!5*3MPro$k^gzA*4$J`HH=Q$xi2W z9=JblV*S*UR_{ldX`ox-ih^1jaWHRRcEMFvzglmue)z@RjJT?;^dhE*q-$RDQMAz zo@PBcd_n$(tA2-4cyA!rp8=skeKtE?`@IRkRL)j&fIOxJ2>TyZk7hX)#pA7bxbGpG ztBaFpJRtP9Z@NTZQ9xv&eibHPack(zj1su+@2$tQ+Lzncncqw?1)mNa zHvWgS7M3TJ`3MJ*v|>f9qQi{JPrU}!X*V|_w#XTqF|WnT_asfnV-L2!K;q(G3ttss zS*mnSled+7J-V$I<%tBL^g1KUar%i#A1}9b$&OKbjKtI9mzZXG^MT%A6&t*-)eYj+ z&t5@X$y;rHYkP;45jC9385D?#{Q)Dw4ilimdfEMShzCNR-jwk*a+Li^IspEO$JZ>c z-7>t7K^3M6QELYwgs@|N)0CklY3KIGiC;{`SOjJBca*eE)iN(1fW|hX_yurTIy}w- zZ^XFC7PzJZ9dw*OJYN~`xY5Noag_b-0fA>;u|Y8o;x1+|sBe6O`_?r5;DV4H80k_Y zvMF>QIh7h|ah>N{F%L@VKo9&)>I*tYh^_*ou;phOzMUx_J)fA0Aj z208dOdIw~KnBeTWY{E{qbIGHkiz4}7i2fgd?}y&kB2V=Zq&QBdYpN-~?sBQ55_!64 z*jT2-tZIjq^U3b_f&X986ws8k42FIX7vYs|XP}iLh6PtyZN*+e_E3hFSES9gRaA1Q zyFST(o{cP!(jKQxvIwYT9iJz%*=|?r*lwKy`_dB3W7Cc6DqxX#1%%`5G+=*3+%`l;&8P~<6?48QW)QO2f+6}{2LdFLBDvb*XT z*`MfDQkko}xgv7@V|S%k{VyCNNoog`xEWTrQV#O(OP`!Hen9mihd&#iF5~OVZ3d4l zeF6(h>GlpTIe;Rsh(NmIC9W!5FiuA}u4hGT8Z|UJ#9WljkomSILyG^Q+i*~fK~1zg zE7Kyo;5NxHvgYr)x`DVC=xiH7czyzp#6sIWZek(r0fFW$2huarP48r*9mxKG$&eVc zMF=;=3L>3@zw{BU4w8z*et#s`Fa63{(sKn8vMOo8_WL~CN|3E8R)zXklySZ`miSs@-?xK)B zEx~T<)FT;13nL41d+1W-MWoWZe!WE7w`Bt0{QiKzxk@*sv&V8{ODNW-V4WkCP&FZl z{@x;*|CB^V_g!jo9;7R4CSRztNvf`9o2xJkN(0gxvB}BFXHCImtww|P;5qAu=stUu zeJTo2ZoguUXvQ%H%QQYerxQsKG3i;CBYGEcFyZLPNFuM`*_Z7E+~*O@LOb^$kn44U zWpW*@7J;&C95rvjV6BeE*;?JLpcDD|V%#3%?{5L&PzfWhlgz=Ev*jIpUuH@fc6Vd0 zKPhl%M9wWfKmLC12VxGo?M!d4F_U76KcN$>us*>1eaaR^dg}jZSqXR&ce_amH^*TZ8E};}|Z3 z4xCDJnlATIYsLzeGWB#pQSR3&2QxOOMpXtqNZhC0m|bzdO*1`nHL6TrC6 z6aoZkQqND1##aY(`Kf1{gM$Er&s31%_CTglHKrS7F zASmI_*+7a8W!M`Y!)`Gx3EcT5G00-SAvx&*u#A-!GmJ0U;~~^B({#r~LYEca5YVC4 zjPb2O5lTe>27|P?58z2NW)y2CHe$ETCyrZ!Y0soGUll4-DL+q~YMj}~e111^JVZHH zX_Vd<)D{Zj~Zkd)qbdv#%Z)K#Xr z#dsb3qKTL=GAjUan+eAJenxNDTB1+BvZ##*Rgy15uR@5Fnf>GaQk9YIGND$%IyKrE2vYwP-X&ZT^L_TgAm@8;RuKx zcC)^rp?H9A=mTKE$E$lmQxG#>PvPi)Rl zo7<1}XYF=$9HCE%I9h*8V{jncPv{n|Wh4#!VOu^=M^z-0YoLg&_U4dIBHNcIAV0+Df3JTAOPxVQTN0@UaZ%%ACbHD?d3eiBVE6qpVD zl_Pm42i2jjPOQG2=5n}EZ`70QJn1fyDAJ^K_*9c@6M5tfikZ! zn}KMXQmG`8XB<~6VtUca;pyysB8wOeZxddew^8q)*BYYom9$gW+@{ zsF$43g9*Q%hZC(Oa{EJGPvmMupjDwnBAkV;hi%ok&aqtGTNZ9xG7zv+YvDZ8^$KrB zInGrMZ0gr}wnW3C&}$0ZF=!oSWKc4o%EYm7i=&-bv0f%c_aKX=QvBpyND{WtcU`Gw zqZk1>z~tyZxjwvO7HmU2sQc~psm0Cl_N4&e@{8&3G)(L4*TckkL zARv7w89~4<^HOIf@~fRA&-=-4s4DFQ2>X$*-W%{L1fdWOC4N6$2dA>!%b#zJ5c5-~ z+4bVvpAU1UK9$z5A#tzxKpQPLy8>y2Iy_{&V0yeFy*96Wfx95r<$(mc2z7r{y6c;F z&+Acw;RqKm6+VFan8q7phwGa|3kCW98JV5MLC|ZLoA{M|^weKKf6y@)R<6u7WQggE zuIj$V&|V86)V1;(qStLBpW&V+G-XG$V(sh~M|e{kl6H<15ZB$?V$oQ2*oQ8tYCVu> zlN2P1b^$NQv>?*NA5MvM_5`Y>7W#&NThrIsR%Lwd6jKoyoxOTIOrFOgy7j;$l4yhF zdJVR`?MDZtC?ik#a8>et(s{Za)zAmey@vVC=0ub`j!KO1rY?wQac4-Zi#n_-uP07p ztNt*IP&##imunVUmE1ellJsEKEEA!riPTLfKD&auWHI z4?gmVK%P!O_0m>juF`nZ7oPY%2~|0ZB3+U#EH$%!J4B&sNs3G|ix`z`iV?le3%!gF zpy!H-4)|XYoXcj#YV$P~rZ9LOl4Sa$8vylUX0Rk@jAZ}Ro`$-R@*Z{Z8OZ0u;;@wG zx&nMn9zZAC&zl#_$$tC8{*n5|W41^2plKZVu)mt7?*q?MC3JM1QSLwyU;0f?(G=Nc zS8PduPqyuo*ByFL>QVN#d#pLVglfZ`BXct@3y_!^z+c;NxaM@~*tMt_FlhD>v|sGCry{rxTT@K*>SF27+&pID?iOy+wc!mw}b{wy2b zCBo}jWlqWFpWE1Zz@tQiZ_3?T8;@4OO7M zS*0Yy*jK(T7FG1O&ph7l0stBwVIu&sr;MB`V1v6`j8gTW=I`s9xOdk)Twfcf} zNY-I2pzWX~SSi|nBbNHtioL0!8pm@bh&J7BJLZ}tI@74-vlnmV&S)&5h@Hh@nnz)- zeciIcRo~K8!I6AyY5r52gJE$-XCyHz%6l~Nno%mrJSlH5NxDibs@rRXdyC*ne+7i= z3{?T|;N$QcUck%PkO1*QTAZdhqLefZ11l|M~kW!c-=;c2m<4j z&lYI4&wPNPKikQPg4?B4O9$91`9{#LL3a{BX$_ohM)rThBw#ZmZKOmT@f3WzFBd!MszMHTJs{wXF7*@`) zf*mRG-7H5ngQ*rKPvdzGeZ&2_LK2!Hi*-b}_d<|{Jy;@(L3T$(B&>k^Jjho#WP#i& z60dPVedj~>_@UB#q+Rfb!_b(SN@`3`Za17QJ*wrQa-4o?pGzdDw8=;!UR7O}RoM0R zS|HB_rALdVyD~$W{NCk6AD_$iJE^!&%@B~)A}ya6YR91t4^m1b&Cq{?8GzaL-9gN? zClos(Dg~azW9%kcC>#PEi5P6h#5H{fm{-o*2a!J`@LQqwT90w|Fss|xFQ=5l%mo#y zKU60gn)a#k29@;OOB7;)8g-4m)T_NN@VshT&N1;vn}Q^*b+^!W0}HdIzuSaax~_!> z`)qPfhKFPH7GlT|3%9?K|LqY1BzQpalS%pP(*l?CL|{7S8D~9_lBH_%IOS69Ii2`1 zcEU?P#E}}X6B)056Na4NN274-rN(|BNE=qAYBQ{3hPxY~gLW_di)Haig?P|fYe#+f zuAL;bPM6PZ{Sa!oSZP=EAoEiPI2ytUYBPZ-yq zunU;Woyhb@pLcEGAHKcjL@z`EuyTt+1On!ayj&7>TW8HbiJJN{$8gE#BZ7vq!^Zyb z5aOlv#{2QJ#T?cG7mWIR<61s1H^!;4bCWB!LEO<)BdR|skLV9s=zVk2D@+2~zp120 zc!wC(Ry#+KdAzH8psi{$U995p!Ak{^d7fm`K~0QhVZ6Q$sKWrV_d{grdDP|h{+nRS zmT%v*ox!0Njw@4=+9<`W%AFVZ7iW+Dcu;W&VtK5T zRV4E%5%-KlL}a==+d9hqv52uP^rt4hEr&-duO(WwR!$oOT@cA>##50zBvSn@m5e)9 z4LKOGhlvQN4hx`_KqaPJtPjO#9UA1rAP#?h76TC(*IOtKHva0-oHqaNbUSe&^6V7R zVCHXzWsR)WCsZ?}nkR7w0b zwEvhy1)%sdTO(NIZN>Sbd0qJ`qq83T?&OkqS8J<$IK}asQ!}eFyr)} zIWtL8W+(v^Xa8W#aX-m}&x&d#a@95wkDBwFF&A%an#nM!WTJuZ@v%Hns_b7caHW8OB3z|FGBp`boL+`4+08Q!j1oYeU_I=tuhk zOGuc!9l>S1hCy64%uo9th@hD!uJ(LR8M5;N2ch2 ztGRd9>J+_(Ku!uy`1r#bNG=*r=F8@<0c!#10Uu}s%F$NKasmKSJWyjc004aJ`C_fQ zkzYeY#ndmAQ1G|YPgT4O)@dOZ; z?Lj`9=RF1DA1le4KfJ0C!@YJiBE4~N-OWqdh>;*>PA<29;S^-tfFg5yAn=o*1xqb? z-5=U_y@uYbUyqEFOXrc=pDvLNOQ2Kx3L6isPw0E8KR)BMS*8b$NA0om@@h3Y9h%VF zs1~a;)_j?Y_kOyi{)xi$|LIVekMV7GPwj_nSJ#Lo&!5=gz2lFDTIii8t6fBN@%!Qa zI@)z+@Xmlv+X{4>oMcn(}_tYEmc=33~%5 z2(RHqj&Hr1x5yI>8M89D9|v-k)K>G=%vR1vi{@(p*z7q#-o(ep?{$7fn_p0nDlsHZ z|NqhEAfKR3X*9;C&JgeY6|0p|STCIew4u?kC32oeAiKaT=PVcxB!<5E0r?UKF$N`jwGl0pyB=tA84t32 zLvZ8^&ym`=o#9@(!V}|z8Hol!D^p@39#Ax(zv^(W5YkO9yq~YV?Wa`Kq=!>#UJ%(T zu-wgLg&>j9wmXbNrRaz{j#@qjXlH@l`yXxL+ZAcjVLOi0oPcgzQQ?-iv?Jg3nj#|C z6L9(E2{D&i+)-U0FK3|Btg)6j?mmLUM*?$nEcyLNlDTT6&iQ?8zOx>uh^aljL-`bWy5xW`5$X7!wVd=A#y&EI z(M%|pw0DyEUGv7HaVPPWI8>AKF%Dr>MnZxyv3_)V$#GFj48n2pzd!bSJ(_}E3fBkt zC?Kc&O(`7N;wkb5$_@&dHUim#wvad}Tl!~6Wm`)S1fimcOMhQqG(bTnqtZQ|%)7rk zk^4hgLRldnT*85(`xiDCC=N)G_`IkDL_`eDv*u+qJ#^P!a@Hc%@XsZ`BcS(jXE!4Z z|7b7B#$meA_v0D*$9?@@1?Y)^@cPgz;;rx%0h$i)p-+3Pqib8b*$Vb_z;H>Jg}f>9=;Ota#EH83AF>a5fCn9u*{h$QKI zpeINg9yISh3xmh;aA;B@d+3-F>4d<+>;i+5-&YXBiTO2OR%!smcWa15B%wJ~h0~#C z1F%>LGi5AE&x;1|m(Ave1&=%-o7&d^=@s|-4M$(oajS)aGl}=}W1UPokID)!m9BcT zONGa24{qyJ>)jsR?d6P~=b*-4<0ORGt+@?zNHOP@$SE64>Wa?2CfgxzgvgSwx8Pz} znFbR|4XN(VceCREQiRP7l%X2~t2riG+?~0Bl_uwpUk!+;TdWp107A$+SG7d5^_=UZ z9oo3v2eNh3sRQ6wX#l>vrs{8Uz=HzKq9xA8pNB|mP1*~^@VX@NoscMQlTM{M5@&y` zVN)kXx!dKJ^_V6he>fA2AY!*4FDte_RT%s~w$3^#%6DJ;FbpsQ2m?q;3?QI%OG=lt z2o9ihmxPprbVy4hA&7v2gdm`FcXu~PcZ0q+=j^lJv-du0xqj>Sk4u<&p8NTJuj_MN zkF1Fuq<{!j@3r5E{S@Hx6vD6bC5|V)n}yG~PTTP~uPJu|iC6DctyYxqW`6u^2iOZf zoA;(JYQ}(Qf=vZ)qo;ed>rM}T$p3g_Sl$rx2=G-(2`pMYr}RB15xjjdI3z5| zLXuuW7b|gQAdJN0xFpkO((3;whvG*jdYjg0E2z$T>_1 z1{STarfrj85aj*5hHsGuQ zM>^q_P=QGz^h!dAjBy|`^f1K`TA!-pz4`g`&|9qGVZf{8Ti0M`>W5ihnvnmeZ?ArB zFbSQEXkt#s@?8U$-l>)3xx#qS%ibI7dELJMNPPk)nCd|Gn>1h4qaB$*M790EpV~IH zLUvM6P@zu?gg>H_l*Licnwl)>5O_=MGb};XAT$3|F%>X#l^QCnl5ZEd6Zw+ug2bB! zGPmL3$UI7&B<{#rkHXS0@2pb&D z{dV>`3ACmcB`&Z;0SEkT{MGKHBoLOl7f#wzVlOE%3&6g6gJu9JdUSNN-%QYZh6{(Y0K)JtG3tE-B^Ckd{Vh=VRdf;4KC!P*Id#wtRlB`vtZmTQvnj64Rf!P%MD~AzShDH9jCJ{DVQm-uCo-36IYnn) zr3&8wl>~%z&8WwhmW>+^VL-sGK2q`)JCe}FD7-@{V0$0@KCejwl2Yx6$X+;PvFVm8 zaMbKedHl|z)8&6I>bi{@u5emq8TxrN3E8>_rKWE$d$Wq@$xe0DcpNF$T`u_= zME5`bU{pv_RR8CVX0RROZ1q{p%~>&1Zz?qfso8@2583cUe<7`JzcPj37NcKBb9=WZ z%cwK&$t(S^##RWyXT~9|#A}U1)8~Ep>or`jeBlQ)lettpr8oJ1x&WwVmsE`~1HL_; zz=AGfO}p*WDBRD_U$)0kO0XXNN@2sp-t0gPTC55j-Q?FO(f{kDN*8o z1ecjjW`7MN;-EGf-lH9ngEZ0$Zx;jS6^=pzkV6pJ82nTXB8v2WL4msP2C3}l#rjdv zky_?TI5+L&HLZsPRNWaaV>)ZE8DK>F0sh#BCP5;5HNz;kEdBNEI49z1nyU7}g+-z+L|xe4HgDcVyBxhV#0K)kNtggk8EG=0P`t z|6_y!PqShd)rB^X!sH6@@RKJwAd*`;Ny~rW&s`pwyBxVyMEgoL*6ErkI>-=J36p5tG~X!7lWe|MKJg}5-;2}S^vN_0*zXv6 z-|B!}Va%>vE_=0Sb^C^7FJEU7ihvzr!!{+^m?~n!U32;w(U5%DLV1XQ1U=R zhKzXN%u)FL{`@Z=m5xrWG3v7I;%rdhfV)l{jnff7AWJBb6gY0Q1ksE#%_JG4T|dNqn+t7F=m-SZc}nBvy_F!e(?!ae_>kBm3mnBv+a+hfgm-4M zeasCRu*!3Z2m8Cmf_!k+Ig#%I#G)b$3uVW6Z~sk@**o^rhVQs~nVTbD;tKSp^OTCD zGVxHgzcq$jNh<$RR!3O<`|{g?i~cfm{d2VGwC;2i5uwz3Lh15I-D=CU?U8^V0rR-1 z`g}}W-5>U|UAA=opD}1|-EILp-Fp_#OJ2B{u>1>eDbr>Up_0_SV0gg zY>p1Tb1(IqG?!5mX#`lH=52MFmPpJ%9FqUfi-B`sad7Fy#I#8fk3pX$1%cx1pyGrDeDL4-oLmLJ^bT5Nch@StGkgAJ{Zgn3!1#h{Ia)?TKPvIwJjlWI9%>8>F(wRe1+6{;LH8% z{-$0C|4m6Let#J~oUGX8jpVE;dN^klJBfxYu-p~Ow6G%tN!apcRRSkZlj$tfib3JA6aB9saEWXzue0aANzMB z{J(!2KYzxUz*VKMP{L#4a!%M|$t_YgiM_$?pG>UU9%nr>QuiD3z9SZ$E&u%hcu)sr z%j9GsUpd1ezF9vbmtBMpdOjb!C2%I=uWd(-p8HS zg-xM5Lem>f$++#e3XPv36x8o9iMZ{?13XGeTRYLzLQ?`?F6xKEM@vElC8fCIg&t^HHVQ<<_H5fJXRCLCwYy5rzZ5 z6T*m2^uP)F=W0(JShV2_Wp|fwgOcda?m9}{Myg9HS5& zg`NztX*c`~VkI8ugQeC(@I<+t#N)Q<_IfK`&C|GfeGBk-BQ|2qv{zdL* z#nZQ$b<$;q(Tw|xA+%2byVLtgF^oYTprcHCqgV!JE{68T7vek*$Cy zH-6H(JR|~GlJvLp%;atytqF94xIU^K=bnIVOmW@i6XbwO3Qy~i-}pL#__cce8Q~U< zI#zcE7^&I|+MI|UxI*X1I_WbjBP@qO1ulRILf>Sc!+u*pG z@VpB&W30`{)*Q@8VcE~Haz2UyVs%Q-ErfslwA!?j=yp@=40sT*<+AmMe;laipd`dg zQ^0=afkm2Qu=1_ieNRBtEzi%HtKI#Kw2D{zK6=@mm6B%sxQnCpZjcADF08pc-Ldg< zULhg4MsLtv1&dR^&2z=d5X(zYYr!=8crX}|I_G^h>%e<<(hLNkHkJv--cSz>|mBTFah*FQFTJ{{+z zXM2xm$SYPB&93Bruzyd&>VGX|-`{I6(omdwTTgJi&(nDAOA4*TNap~LzwhhM?RO}XEmLva&+qD zA17bjf5%$HRrv=@x1F~zIgJ8?;gvcdv{fkImiPuC-VJ=wWL~eWYRaLL0V`@F8_!@R zb%y&A+-kfi{WgT6k;nkxkaiH#pZY{wP0$0^OF@*V?+tzmQB+IjlH9F5(~qn8+wX_bHksTlqq$U5v3*@Hb!I;aalzG=Sm$o<{n!Q6U~Hz!r*KaTuUtXnIq z@&hfz?=;1(X7>!JJCAR+iEp8oGA`j+Hrqcpk4%HI%M_S`-QK#NwnNaYyd;Ae=8$x} zyqXSDXi@=Kcc^SqOsPjUYO|SDY;1A4A6Ov$R$yLdvuX=aRH3=`=5;)%8K&*l|%45{6NG}AI93Bs= zbps#cR!h^RA~7+FJS7l2j@iHsw}9GG49TLYj@?ErIzyxtPzn?1;alJU8iPrfnfDTf zssi<~vLKnSg(#FkP3$Dz3#j-{i(Uwop+YPjfW1Yjft`to@GSWZ4|f=m$CLaD(%>57 z=Xi}T7TTfc&cQB-3OY$;4{$W9{7L3Ei9ldPA+YMsmv9+Evk+1kGK8oIiMtw&ZG5l) zNboftVQRpg^VPHbDTwR7HjrsQ^66)|Y)E5yUS!)g15TwLXY^RyesP+TU0lkgF!J5H zC-D#HnA05m3BSymEC`+8fE>=$1S!L9Yz>eyIG4>wQ-I>wKMMbrHK7~wO$vs{F>Lk! zrn2i>fpP$kmAP^azmh5+mwLic#|wK>2g$h_kA|!2HQ7dHvK=7T(E*!X+Z=tHV&hfXKaY4@ zbRqKCbDkJ3Vc3{W75)^KT(a*w;5(43a<9w|)`U)a4Zg693m*Ie2)KIah)9W1g2u7% z(gh%gMMzW8C2ODYof0e=X^hy5;!D%FP3eL8B;Y={TlB&kP zcKgo3;~2YS^h7PxSVRh#=w5xsB44q*T=B@c8ft?1qyOmvN(|E7dIAP<0mxVp!$w~N zOrxdfR#N5t16C)?Y2WI|D`B^{9gW4|sMk%;(XOi&!Z{(z7YDcx>OPX$mdJiGJX0?@ zTDENULn93;fi|ArW9zZYy#HX>7c-OnDe~JGE~>tsjYRadEU+&h2|z~Tn`kBgrR@v-AlaKeXr6R z?CG-iaBE3yT=E-C53t?AuVSS#&kF~AF;5LG^bmzSh8G{FL(6A4@h?TQYkSFU4@DN{ z4wOXnADtJr9YGo)kT5Z_dJn^Uq!rFfD9MI5c01TCser!x+ zg?YRBq5{UDfn0*E+N{(texN7%5!xy%J3A!DFkdoCky)W0G-g74 zQrgEt0YET+!ToctvxLHuCrc%c&ly@oCD!<58rp9gZXpF;vp zNDK^oT9VcNu`7bX{_^MDC0};ZmJD)IeUza$5Zg;xJq*iQb{!e+d{(R)zsX^er+&bYDB65}AMm3<%Y= zu^zIEzP)dqRKiglmH!xcTWc__P8sJ8RxDJr6Haz3=ozzQi$Jza)Yo18kblfpY={|XC%pMeVN05? zeTxKFK{VRkX9m3qR-q-KKH}>k0SnLyvl9w*LZvTMy)H(R??KSfMg86)Up85M$5YdG z@E2{(?^F3fYHJfIbGL+Gi*~+RIxQXFN4)8mi}Nt4JB0>_k_TA4P*@mZ6)D9NBcTsB zRHD|eK2ICo6WwoLJ(+`FKJMR2o5=W|4Z0yyBDKu2^cgzq#(djDIJ?{dCixQXHARD? zX^k&tCpe}Fi&M2S%t>EJ2aB$-9K=qv+K0(WcFJE#liua> z1EimMW0dTBAITpkB9UJzJ8z`m$-spp@=zmxHt@a&D=G2nv6i^9Eg56RfRii}z~Cl03d$r8mEB*56mW1!-V3#GI23hQ zkN~D8pD~Gk^F&mz2l(b#U<oTzbY?E$HuY`C;dit zzwKb1oM2jw7>@FlQr5t(b=8A;Co_;{N@7qwmF_96Bx<$BJ-}2=HyVYMYD`Od`6Xi% zBqJflh1@7PhzFhTxU=JxZCCfrclLkijCW-rjM>a2GE@@j3WC6*jC_lE{bu9UO?D!) zC7CH6VOkU?0;wY5s?5Je?HpUR@`Isa3(^J`*^$+MH^dLA-Q z*22|Yp;i<+qb=i*ulHzpJ1e?EKP>)JFK7L=vGM>J$BPH!FWu4|_j@h zWuggF^uB7Irg7zpJx>o<`~1fCG>Hvex9+}D)XwQ$NXc=-Lm5Dt;#6e)WY?c@DV=Sr zZS8rR8W4uzU>s`lf$%zrOmq8s z@bN4JdMIu5bNL%>9(CgvCNHK1L5;r#*7Q5&-b;>_s$h$t#%a%AQycIc7kn#cRD7#@ z#;~EY^&m6yi)mqWEENse?SIPzCkdS^o6m2B9}nhR4M?q|rpfcs-@5q~@1pJhxhhYY zAT&$iIQL7re_IhZg4pIdsmk}rfMzgqrVO(Vj00uLsi%F`IOs~3T}diWvEkt-ipGl} z^t_lmlzd#wk>_u-2xgggG5SbtM)HlO@^+)I^nX}ft>04W$zHsVfXQU-y1a-aUeDkhHqBEcY$)sa zZxQ%k|9fzIAF^OsQWdA1pSvB{km=+~AsSsj$1-Gcw>zt*^63D#ZDX8^d7j0(3tpbYNT((8fiLksQXSr9Ap16SLc`oNiVx0*VJ-Nr;FDObc(aX5B8tm@t> z#g7!doDSt+eO~msCAo{oYUsWY&;m?By%w*kzeR7VSs>|1>qDB`J)|MJ_xxa4MUP4i zCrb`PhJniL-98W$Q^ZC}%Kgx8`v>`lzG@dbpXp}Xq-dpg8q0o6rm@#7BzOLPd(r*x zKPAkFk`}TbZ5`qoXk+vaD-%_Y#3AWXWVj|=S*^v`RNOd(W`Oitd!PklbO+&5$+g}O zWTXa$J5RqnWjtzd`~t{Oe)>p*`iZd-&^Gb~EVm}I&Y`z4Ngu737jMKRcV|cAlVqcO zAAgXwH%>$RtLJgc*~ZcvhH(lPUlU{D3;#w^gP0kK$LlWzJBX_gfV)t{e%AgrJkRWjm!sF{BJJd?F#|xo_Lh3ddN@_Oo2p~{ z`3lFda6~wd-$Zdkwy1MoVxdjMFHjxT-WD^5mL`i}iciFIQlBkG4l!v%;7 zMU3`6#o9gRC&R!UqUH#{zwJ4E6&WA=RJXl&=4IwMrjkTvrayJU zr~hnf-`2TJzrVE1)rCpCoqDuXb6o6g^)`!{fxZ2r4K&smtBN#f4DUBO4Jk6G;2>Tu z*sLWy*XL$NHd4GAFPc@Rm|8jj{`nI*Ik?s6*Mv#AK;n4h_XsMXA=o3!Ps?dwy*Cdh zs$iyeXh3)L8V_7c=G9~#^6bFHu2#!Eij+9+W}6Q-YX6tZ<-aZ+PXRx^cHNez=!K>| zSE{C3U%jpG)kX>V77W;LCAez!yHHRL4{B1eChqiAWbvp*{`P2igjYc|sTVVFhs`)9 zDK?gH_XODFyn63}RLlVQ(%8XI^0)YJj(+W>&`nz^Lz}F}@%dt3$^!=oVs@Wu`P`Xg z;#qvN>9%OGjR>bUr5S9>;5W;e0ec7|>3^^YF%s7B28mA}rK47rd~ne1vl_j3+`21# z7q#TOYrD2ZYagMi8Vqm)lV;HMVrw8#MXuPk7H@!fa2wEy0ep7HZCD!QwpID{P>t8y zLe>;-hRdlLGP5iZC7G2?=^92}5AN<#JHP&S7p6lT5_H1g7PaKt$`ptOigLOXdksh^ z-*2c)GgUuutsM6Ju}*YdS2~&xtV#cGiq@YIn~Lp&6T1e(yN)$$*)9}hSm>dzFUSsm z99@49@cj1_7&?(cssy^w%qXS>y;J~z+22H`7LSLuSZCOuepHILaM=!k~W{z%D6i74rM;AZn-xmON+J(`TujcE{W<~cV5Ga6+ zgUY&0zV}E8S49a{ES2+{DsoZ9zPsOQ1z7M`)`v8+exu&(keP6l28Ow>>fgMH{C2al zI`@O1m^+rNK$LU&GP3>J6yEZtm2sMRItT^?y181vMQd(AUK7-Hd{p-ECmp~*-Q=dj97`=4c z`c{ck_aKs5L?B7+E6PrXG!0Ez4PyQwloWnBC zIcfqBYR*+nXL+vg@fnC7Nc|Hj*0W3T{)`^r4l#ht)Taw>^g2uek!>z#L+EA=D4F>V z+KwDfK;`fK{l9UGa-NnD<`1CLc=9`-`FSx{YPseZnW~6BV9#!!NolATp!E63 z<4p^pyr7TH)@R$a8dp=Dx|K?_k4n1K^2J9^xRRF=)DdAJx!g=cuAb>+T~DcB+wMGH zH;OJci%8*MjrC>F3QjPd4tj~d9D#Dtz@r)Xab#T$+dEakMd(jJfvdy;mtx*oG`$@(bXjcv z0H2t7Ex_BjMKNbSR8*RXmEw~yt7TAWVdE0Uiyse21I{$j!65AZZT)Ut!{VO-GWU8g zh2-L1XGe`w)cw8)^4$H|o)#10G!rf6ro#GYXBnuNhlL@Rz}n&+_2(ITyxe;3f?5wC z-|iFMV)NK8ZHLy!dtkCzYn*`}@t8#b_h30nL={9inQt8+KD()BAVtk~Zd{Ch7Vvmq zRsln%C_~IM_41s@0vp9^co3$EUAwkQg+LkxaLxfg=vO(=Vk7oQjXht$s|96a$2?U1A0GAhU}k=XNzRi=2jhkP!j6~(jiDES z-f8k)KEgRW1s`L`5ue`~CTY%sATS{F>uhOK^-GO|1R~#+R<*9n14!vpAlb}SgCE8n zTrMl{*h~Y#e26wC;r>*BB|)aA#~nn11EskSwD|AQ>$F>=O;z+jrqSZ0#HiU6_@IXX zL$xW@ky)T5xE2=zK)!>{cQ~x~cFMb`=g_8=+-luq5by3vWM>7KJJ(-MP;1TFFTLpO z0n~br-8?Q4*rl*4f3<&|MGe{Y9|M-(Kktjs%yr+sGvIr#_jK!(51tYIWPki^(t_sg zwc`;+;2spG6iw=p&;8qqzTPv`H7#IPgiRjal8Y%-h&(d>*I@$*?4tQx2(4lSr|n{s zDt7w&S-IiRgA!?{m&H@k0_LV5>p2Xc9Sn@QVT> zFxJOVcsargN<5dUtw|R(eRre=sNH6aNCnP6Q;%V)@6rO>>el7ZK{LifwIL;H1VNja zitgW$;^^V=?0|89Z5vC2H+Jood8@#ldtC+Vf0!0+vKS;wZl(P<9i}2wsqwjPdq@=q7HIzGUqZ?d^eh8w12%r=eFIs{ zw0(6i%65TY=j*eFe&hkN{FfnB*abM(U-!ri4+6*WAf)ZLW8j4`WN`5o$y@4`#HKdw zI*Fc>2gjW$kTVBuiMNU?B`M_j@g30p;Ay1;ZJv%R9kFXkCaC9==t~70GW$woGT0&j zQS4wNKPY%QU*{b;+6<-_4$uvddLavn0)29S%@xc7FD+~B2y^UiayT{eyy-op*aH@Y zXx`ojS1oxKx|AB|)abc_gfpQYOQaQO=0$ypa&+{kmZ5R;?XQq&0*8G>K15^Vzj~l* zK=Q^YcK6mgn_Uzm+A4cG?+LDOUD`jZ4xH!4VVKx;s3zSKkj7p-%NhHzhl>|4uHT30q-k$O%#00JnEGj)%N<*pabC6C|q)JZjfGtU^VIV|4Wt)pyKC ze}e>4L23xSqgLd{1(ghRmfwZJ`fjr>8qR3^o=nGhB`B*?ypF0RvWK0aHz$4q0fULyT>bb*K&%X`x4zM7Dhxc!XSwZE_9Q_!)4mPg6`kjFgwfr zx&7OSrbuCN3SC%j$%Tc|CCOYVOFvN*$sfseurHbjl#vEV;h|)dXtMZuBY|!x%U)FN zgSHKaA4TA&85eA9pbg+EF>U<|s_fx~!KwR<;&WP4=vaIsVw}o$m~eJ7LOR^RyOCX?h77=FxzT4TUjxBxN@_ zAEVUI=tyhz^k2jbA*$u@QpKl~mOgW!u5b?Cwc)RbO_^Hx-S<~uVTsW}_?^~~+!rJzRoufp0Fx0`rN59Kc74z7X$)#~_S#G7XT}R;UW7{eH{wl8-vC_J$>(TGy z#7S@3v{>iUf6h;5>R5Em#Wg(!9XUT+!dHnQSUc$%5_MJj2%c;WW5+yrH2nsJqMyMl zPNK2vn4-^i9*V@&YxYK)R+m-YkALwHoUlbN>1q%f8h1X{eYQLZ&Cla^P;yjgv-pUJ4aos9PVCA40dY68FE&y=VUk?bVsO4xJNC%^u*)+Gjm zl;1n7P;C4q&83dzql}{xkpHqpi%R{%oT#fmFu`hMXwshU3rI~{7yMXg?2@Md!8+Hp zkvBWIn@oC+wo8Jb-d$h?_kNreg6p?b0MtMC5e~6#1r0Zy`NC4G0%B9xO!*a~k<*>Q z75>+u(Pw1rVTIpp5NR*0J0O5wFgb#7Lf&Umi&v_>~~Qk-Bhj)~A}7=#<{RTfhmNQokz zT0%bm2p`!0SR|P$r7abIN%EuvX*14EH-)?&IQoy09uF7jd8Y zB+TX#kI97z0PUtdWV)JcqA~JUk{ljJ-D{w&kO(fPAlJ1~IqXqy-oJIkcIQyB#x>Fd zB*S#}o0z<5a&pNI)lv*V;N*9Y>yxEN^aW^XH-W&K>29^z|hFN>zsmFz*rQ_Ukt!fA?6d{q$#=)M}T6n)b^5 z>*PlCaPu6jU_nVFbgA^AFJAu|a(4*yj)1b<{ z<*w)~ernuk1MnUz1^xZ!Du;(Fv%R}2OUmncy28Jhp_Bn2LxTaSe}ju*$|PS%WC0Iw z#yUpe<`)m6ODBFjF}gnh?(mWCmt7LPDt)LLJOLewN| z!7cn&*aPb&-Z43eZqP!a`;}(1zY1j@ zOAOm9DpQL0b8VO#x9=d2AIdM`3r|)SoOqfv$6_^wvjJC(6%<(x*%3`U86uIo3dhpW z9gY%6flq?a&hi+;97Tr>Z0T6W?^oa{{#mlA#1t2NWxE(a>)fOP>ydH=qYQYHT2_wIJ;@BPZ6KzfZmLi$ zdgxFa60U&BwI5I4luF{tVj_Ufy<|U7g5`~I?5|EzrOPnDvdI#`d&SF_Y+14Q72%5rvz0#u(s|I%hrwPs+CLgZV^HS;G4i%UONZBn%itYUM^7aVX{Ie0QP+q=8 z!58<8@USj=s_-LaVDxRWh&apGsR{Ns9Q)W`S|;8(;zM@|b;`0&IrofHO+Q_iGv-M9 z(15bo-<8|0U$gCG2QAu`F!msEUQ;TUcND}r*fKth_nA>OP6PzuO+9F9G=!tuOw}6V zDJGN7*=?pM4jzg0`__%cWN&d$`^x%f1^t@8*{({%*LuR{sh+~(YaE)eV;|`6*W~3A z4yJI{biQqYg;g7A%i;lw>CIo_uyNi$ItSbhrc&kyrI(#(AN-2G?CS|?!zlO~4=vyp zG$kyJNLZG%nSlcpnljBGEN8U#vB ziOl+YhQOPYE?e&BZ%+csgvC|Y7V^|}^)adq1`fR-BR7<%BEddE0MErYl*!x$xXLfD=m%oXcOu}>l9@XWl%?x#PsY7Efq8p zWY3iN7iR-Q^P+fDK2qm$@*D>7AeEDoS61vq%ocq+g}l*-Sp$V7Gi4_V?KDO&MX!X3 zb%|=!JT}?_H;=L5O$2sGrlGX@gdZ;7^2Pah+=G>UCTYU=eTbRk-7#uuCxH@OPwP7kCS7rsf_ci2#y3JOAAcML(=y4>tQ22-`qqDM`NF~DRQLA! zm!laV4}|itn>j4ZF3{|JfiG()Fg4@9xZuv^K5V@n4lNa z`&gu{ilJ{`PHiC~F+mHfKw!e+u-h=4Q)?n{Wa+b}T0v)A|C~%67vg|bD4yLW!Jov5 z$@x44YN+0__{}T`&KUOyD?xdn0rB21!SgQ^4t|5(_ z{db0Qyc8^Ytf1V{UniCQ*LvNKFWfEJwl`}-A6;6cp`?lLwV`uxh1%gv{ZdX8QuDt= zr!$kvL=StZa=0mChqs5*=>ph8pn=!vC;``-w6I_gXGHpYd8PO`2oIOaY1LHz_q z1LY40o^W=-8Urg8VOHM$u``Ba>T;c!9IG7#T+Lp#Y3&s;-V$j`1Ka8%!jl>@8rCVM zVykXuU4s<&p-i>Lym|VRS=-wx5T=D@qSy zX|L(#?Clezi8PF4Q5r@klaI@Eg%k#_b={SHE+AG%07V<~^D5D{$5eZ70mQU?>B=}G)0d( zYo{jP&HbTH9{R?psZpl#QjB0+mj`sPu{KX1Ogsl%^)~JsGJl=-Z$-b zQiK;rz$XVrSI7f|vGSB7G>R=8(lTC1yK^aKtJ2|R6CUCow4zZx{52G4aJtLu5Wr_> z*lW>ybJd1SV5hoPZpQjy9XM)-RlM;!<=UAPvc%t#Eq&PTITd@v%T|+ufa=`;_;Zp) z@K4!XI@_c0>d?+3G*%eTl)8_;W|-jjx&FRf+=so|yu&;lU99B8j}Ja&luY3gHXoT| zQc3dOr^Y_%C-&K>+UfaR?m1~Q&0?{*{mZt#sU_gMBuiFMLv+}~f=O*vC5$qK%=Mcy zxoWFyZVDx}j^r2%xZM|O`wW-*IeXc5blIVxZQt@EN-Wa83NMY~NH1q!4o+n*Z!&AC%~ zYupxkT{%fRYI4XvvdtD&41{!-=}jA+?Fbit>+m#}dzT^*-Wt;BK8&lYqOTe6n(^zs zi+L)+xMg+1Bv;9??F;*Hu}-$j8Iftuv4WliMn6)gPx^yvttK*1Q;er6u*Tm{W83#c zA4>-fgu-$4;8sRI{n2H6BWW=hnIv3$(NYqWPjh@u%eG{+x}Qi--o?fQU#R5}swfH1 zKZGgnOS1_^*fa)#C^_~d$e<}wfxPpN-io+t?WGPWU7;FrXI^ohpoVt=XaVlpZ-+4G z45UQ*8)vqE4PxBE5`e`8iDo&=DEVmIp{Zm z_HKtxUwzhmzzUjJKThq+g@#*!CZR78U-Cp#d%*OdAQ><4_ao#_b@s|e1`JiE#C)PM z9$5p3TnvU4``7OtzpejLUAwD&r;dh;O|e-m1=US(NuDHU5`GGl%n!$Vy+eIsCZUxA zx6)k>#Gum=GLz`~NO{B4CK=xc^cW2Tu* zm0;VaXiSCVxrz@xGlehz_}=M{IK^@rBIfkiW1GDHlF6^aY2&;8@RP}jt_})zohE1i z?;Bf46fI009C(Ow4W<#YO)UyZn_?PB%6d=*-iAUwWHQ8@z(Pd=IrLbw*zWu4@WY{X zkH04+ALIgC6Ec3Mc-AU2NN*79?3{^Djj<`Jt$n{fe)edSd&QSCZ_;WS!Ih<-lNt1b zWKgrsK;PR!gfI1`$7-UYmEu87QY7h`#)c^G+Q*%5a;c=9WVntVQqz)uB`I`ZS#SM2 zOf_l;pH|#nSR?40I6I$433!L~^y$72Y z^}s_C2rf)>&j4YbcC>dxLC0>{tbW1YfRQ-uB?EXDakDi~j!HXYx;SgdYG!ipx8*Mn zauC16U=s9Ph8_1>^fD%SOl(E$^P}lKs9)4fc8Ux0Vs#?wJ**qIZ7d3)srbr$lddf+ zw5*kpqFxc+>$cbj)Eup=+l1xZ%Af1w5an=tRz(5AiVv=KXT7!6DooRHank51>Mnt> zPvX8U2LX}_R7)oGy%GpN!$m`Vg(^Y@xt31O6MuH2+DNZ2Cp{5{Sv82LYgEvRuTmdJ zi64C`UQL-m3Zwoe3wA2c?{X~#rT&tYaJcQNag#aAb>BK9fdalqNTP9`oDKGx`5_~<&+1TQCA2^+= z5X#J?cU8b*B8<_~fk?JjH|spsx6I7P_TeXcA7KF%V2XKVDU~%E&qz%d@qMY(r)5{8 z*h+j*bze&7%k+kp_ffza-3=OeNA~Zm3z$ZDFuB>$)AIf!BVn6$p}eEmai*u*Ib$+k z6U9YdL7nc_pDy26%%n4p;hWBG*+1&g-+Yy!u0JKZnVXPs7U5i0NHZ*VKyz7&e$rSO zr*p7A>Zb5^lYG7Xql<67wZU@+gV9Y#?I|65#1}RJcS!Jhmq1IDb;^5ugL~2@Y_C`! z?lG?`AFv@sg!008?Hg+I&84+H-c^y@UTA(53tzU!nwf< z7tY98nU(V#I7{-_t7x6piTl-7-9;ZymJyxv7*=H`e-c*W&6Z)xMUQFF9f#iQ9BXTY z2@d-wj6o5L$l|VsMq*;~GsiccS0j@ceTEAb;#XGR$;w_)$z;KK-~JKlboCuK!MrEv zAi)zO$VF!r6>-H+F~GH8TH*kh^&ipY@k+vPgZ*N8>Xg^CSZC2VPlKL=7%;pD&QwHI5ukG<@?2P3s5@^)NAsL-_9Ve1-zF+gg z3?0I{gm&&)XnfS}XHlQL=>ebPPwoxL>R|N8#MD?GX|EasM;^PRkyWIM5I?V1qpVlv zxS*nEN~MmEKAynn#kouDlwrib^U>Ohw6;Bwe59bZW(jE9uBQB(hO=7vJ$^dNPK zD-3_?r+0Wl8nIXnZ8>@T42@y}+i;t{k_Omfjb?Zmi9hPc-bQp#U@hUbQR+N5Hg>sO z)`_MP`rex)6qb*#Vp%T@abv9NB;+JI91`Js_%4BA6dp2qHXSi^vT{FeDAr}@y zy(=kXM=0(ILlyGU(vzbr_#3zM31XTcvbYr4&})m7}*_sl})mO-~#bA7Ozwm}EoUqImS@0~MdK{UvUBewSy zW1b8~@S!x%ur^Q9Lb}4MW)|IftG@$MMvWos(c08EFEd8Iw#$}&sx`)!yK3}`xOTdW zvC{}xpQHE18&PBA-k3nI@X@`8cvQ|yfvcWJM?WBFZeu_*slhwwPh_*oZXIP+rZj@EArTmX`#W@xh=Eic|`Pv=a60UE7lGheZ9q- z)gKQ?-G#>Z%uXTHBg4oDt;W*8o+$ibjy=KR5||KL5pF$rXi0FKVf;`rm3 z4d39Lt#a%te~Vtv_Ta*DYF<;V_uWvk$^2OI6>E{%qRl>ep`UoT#Xj zCP*84JjE`|O~CzWd}%(ggPGm{o==BWUiui1;`+r>V;1a=-{L&GZY8JT0K7b*jckLNaaU7Z!+cg4 z_nWI<_*ibl@?EE=sqFN_^4Fg8GrepH>tK?yqKsOI{OX}w?iX+A#AmFIj8w?&NsP~? zA|neH?mYQr95$+RU`Z$<+Q+JhyM=vK=H!_?J}bL2HpSfu(Fe)``5AE1uPhurbrXcQ zjRKbg5WLFz{jaDW-(X>&P!~=Xkq%0d#hG}OMB$Z17S0G|@a&hCga*O=uSl)=i>Kz^ z(5CokwDYKoiWRT&m{EC_BE&Lu&NTOzse{Fd*EIer>X1H!H8p9+aN914&=SXaxdj)a zt+I4KL4clMsc{>LYg)r#bi_D&^STdaR}wxl@Qk<5?;8V@ke2mbnBdrunAlSarT~er zShrpaC|E+rzY=U^+PBQ7?A&3&aSIHUbW0S^33N@md%hFt8%||7X=!5rSdew4&S{og zcRViR^{h3-W0O_pRD2KGsr<`>kX+XANP<8*y3laHszQ`-wT>g|%J8(dZiTbB7`9kR zc7`!Bi52?hC|fnh;gO&E3?rpT_SH$1A5}n?Hwg=E&3s@f|3){A54_xadG*1|4sNed zh7hI7_e_IZu44;t7a^T#G88Aet=FRR<62@NMqQfRKT8k3rrKBPu;}IMVUIfwQdiEX zB{GmF*GaSXk0jkL+^YCkkr#gTM{MuifGhK377B%)`nSb?67&SW;5o!l`o{NjGK7d( zH|D$TqwOfSNL~{A+c^fqFw9%@*y7V#(}EpJdS8>_hAwm+nxJDL>wvWEA_D9Vo&ND6J20>4r=UYwtf?2dmtRTfBoDlN{F#LZ-< z@Nkc{{zI1hXvB%JQP&~GID}OM@1#~bsjF16)yQw=4JY0kHDSwMp%;ta@Cl|h&B8y$ zzm2zNO{-flcrMAPsZDDBp_XHf4U6|Nra1yfi;7y)U9`YoD9E3mB)^D|$G8qtv_;6a z7(<=aTR<$yszlM?@m)5zE3cRwPg!^TaCheOvOPFr=+8<_IzK%iab{hNQXo7YBE#Tx zaLS=u88WYQ>y@*7FcPuvk>Kz^`6uf^%=3LF>5Ntv1zU?8)bQ>Ni#lqnK*5u-+&#@L z+Y|i`Tvj2nJ!?Pm@wbC)jUoZ`6}Ngt<|laskPIdH5alm@6zxo}y(fp(#q}yBm=_s2 z93|j|p6lnD<@{usj>?G$-6We|O;y+rF$Z`xi`avQ7#1C<;Ksu^2d}9dtVR_Cf+V z8<#b4_TVgr_;%Slm|?f5H#rPtuIAp;84}M-_M=RDY}Opu5}Ld;>`8Ay%XCANn(TB% zQj*Ph*CGIzYp{wwKmAdS?EG|(qtR8jwH2ST%pt2oDR~=9oq<;=(gg54`Ti6Kl$9{JaLX+@oaGNA4BOtH}v%A6;k>u z&aJq>E=yVC@QIb^Lg1iUw{&-;LXg(pgk?s(X#+bJo@J9=?>p5_h{eG@es+0Zv9)(r$1K+NyHQBc@K@v$n`skw;~utG(572jKquEqetVG!4%0*~3!x zR!p_2m3F(t7f?0J3Z(L-otHz|;r6D;*Y2DX( z+cg=NDPz)urCuUP9}wUy<#Q0pSJHB+X#4GAH33ry8UlIK)QFjx)I<-lg=_QX8Qu-i zu-EYX9NWBH60+TE#I5Ciz9$2>y7i)pY*>x9txa}D-6}&rO@J2LY%0AJLD1!9T-HAj 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 Ory%p>agnsqtN#a#P!Fd7 literal 0 HcmV?d00001 diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/allow-jit-build-setting.png b/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/allow-jit-build-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..153beb539287e9e2996af7a8188eec07b4dbc82d GIT binary patch literal 10071 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 literal 0 HcmV?d00001 diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/flutternativeintegration-relative-location.png b/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/flutternativeintegration-relative-location.png new file mode 100644 index 0000000000000000000000000000000000000000..46972d44715554b6391ec553308440346a92c46e GIT binary patch literal 15855 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 OC~{KDUuq>xLjE5q5;MgB literal 0 HcmV?d00001 From a3e38be9e2930d79bb9efeee3892d0b6683e6729 Mon Sep 17 00:00:00 2001 From: Kevin Lamenzo Date: Mon, 18 May 2026 20:22:17 -0700 Subject: [PATCH 18/28] docs: document agentic hot reload (#13400) Documents the Agentic Hot Reload workflow in Antigravity and adds cross-references under the Hot Reload topic. --- sites/docs/src/content/tools/antigravity.md | 8 ++++++++ sites/docs/src/content/tools/hot-reload.md | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sites/docs/src/content/tools/antigravity.md b/sites/docs/src/content/tools/antigravity.md index 8750a193f0..609c97b941 100644 --- a/sites/docs/src/content/tools/antigravity.md +++ b/sites/docs/src/content/tools/antigravity.md @@ -86,6 +86,14 @@ the [Antigravity site](https://antigravity.google/download). {:.steps} +## Agentic Hot Reload {: #agentic-hot-reload} + +If you are using Antigravity in Agent mode, +the agent can automatically hot reload your running application +when you prompt it to modify your app. +This enables a hands-free, "prompt-to-reload" workflow +that reduces context switching and development latency. + [ag-video]: {{site.youtube-site}}/watch?v=YY2w2JEX2xk&t=1s [Create a new Flutter app]: /reference/create-new-app#antigravity [vs-code]: /tools/vs-code diff --git a/sites/docs/src/content/tools/hot-reload.md b/sites/docs/src/content/tools/hot-reload.md index 4aa1c70075..59fbc45340 100644 --- a/sites/docs/src/content/tools/hot-reload.md +++ b/sites/docs/src/content/tools/hot-reload.md @@ -18,7 +18,12 @@ A demo of hot reload in DartPad ## How to perform a hot reload -To hot reload a Flutter app: +If you are using an AI coding assistant like [Google Antigravity](/tools/antigravity), +you can use Agent mode to automatically hot reload your running application +as soon as you prompt the agent to apply changes. +For details, see [Agentic Hot Reload](/tools/antigravity#agentic-hot-reload). + +To hot reload a Flutter app manually: 1. Run the app from a supported [Flutter editor][] or a terminal window. Either a physical or virtual device can be the target. From 7f0ef1b9ea0112553d4bf9dcedcbfe69023bd697 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 19 May 2026 13:31:39 -0500 Subject: [PATCH 19/28] Use stable Dart 3.12 image for stage and deploy (#13401) --- cloud_build/firebase-ghcli/Dockerfile | 2 +- cloud_build/firebase-ghcli/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cloud_build/firebase-ghcli/Dockerfile b/cloud_build/firebase-ghcli/Dockerfile index 996d730b67..cc32168a1f 100644 --- a/cloud_build/firebase-ghcli/Dockerfile +++ b/cloud_build/firebase-ghcli/Dockerfile @@ -1,4 +1,4 @@ -FROM dart:3.12.0-327.4.beta@sha256:5306c1008b585f0fbcf23aa0d7145b8f65cd7bd8c63dce4b8038684c11c79833 +FROM dart:3.12.0@sha256:3d1b19886b288807b42020ede8f1f9ea7753c91c17c27479ee9e7bf584289a34 RUN apt-get update && apt-get install -y --no-install-recommends curl gpg ca-certificates \ # Install the GitHub CLI. \ diff --git a/cloud_build/firebase-ghcli/README.md b/cloud_build/firebase-ghcli/README.md index b02ec4669f..9978b3ee1c 100644 --- a/cloud_build/firebase-ghcli/README.md +++ b/cloud_build/firebase-ghcli/README.md @@ -8,7 +8,7 @@ to comment staged site links on GitHub PRs. ## Installed tools -* Dart SDK Beta +* Dart SDK * GitHub CLI * Firebase Tools From 335e0730cfd90af6c281f9eb775671e224906a0f Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 19 May 2026 20:15:34 -0500 Subject: [PATCH 20/28] Minor clean up to 3.44 related breaking change docs (#13409) Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ...roid-large-screens-restrictions-ignored.md | 20 ++-- .../decouple-page-transition-builders.md | 36 ++++---- .../deprecate-onreorder-callback.md | 65 +++++++------ ...precate-text-input-connection-set-style.md | 28 +++--- .../icondata-class-marked-final.md | 76 ++++++++------- .../content/release/breaking-changes/index.md | 4 +- .../list-tile-color-warning.md | 64 +++++++------ .../migrate-to-built-in-kotlin/index.md | 51 +++++----- .../raw-menu-anchor-close-order.md | 65 +++++++------ .../breaking-changes/scroll-cache-extent.md | 92 ++++++++++--------- 10 files changed, 269 insertions(+), 232 deletions(-) diff --git a/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md b/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md index 7f0052019e..f1d47ce7cf 100644 --- a/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md +++ b/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md @@ -1,9 +1,9 @@ --- title: Large screen orientation and resizability restrictions ignored on Android 17 description: >- - For apps targeting Android 17 or higher, orientation, resizability, and - aspect ratio restrictions no longer apply on large displays (widths 600dp or - larger). + For apps targeting Android 17 or higher, + orientation, resizability, and aspect ratio restrictions no longer + apply on large displays with widths of 600dp or larger. --- {% render "docs/breaking-changes.md" %} @@ -11,18 +11,18 @@ description: >- ## Summary For apps targeting Android 17 or higher, -orientation, resizability, and aspect ratio restrictions no longer apply -on displays with width 600dp or greater. -This means that [`SystemChrome.setPreferredOrientations`][] is ignored -on these devices. +orientation, resizability, and aspect ratio restrictions no longer +apply on displays with width 600dp or greater. +This means that [`SystemChrome.setPreferredOrientations`][] is +ignored on these devices. ## Background Android is shifting toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. -Restrictions like fixed orientation or limited resizability hinder app -adaptability. -See [Android 17 behavior changes][] for more details. +Restrictions like fixed orientation or limited resizability +hinder app adaptability. +For more details, see [Android 17 behavior changes][]. In Android 16, this behavior was introduced as a default but allowed apps to temporarily opt out diff --git a/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md b/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md index 202fc1a7a2..ef946d61cc 100644 --- a/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md +++ b/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md @@ -14,35 +14,37 @@ description: >- ## Background -Flutter provides several page transition builders that control -how routes animate when navigating between pages. These builders -are used with `PageTransitionsTheme` to customize transitions -per platform. +Flutter provides several page transition builders that +control how routes animate when navigating between pages. +These builders are used with `PageTransitionsTheme` to +customize transitions per platform. The available page transition builders are: | Builder | Library | Description | |---------|---------|-------------| -| `FadeUpwardsPageTransitionsBuilder` | Material | Default pre-Material 3 transition | +| `FadeUpwardsPageTransitionsBuilder` | Material | Default transition before Material 3 | | `OpenUpwardsPageTransitionsBuilder` | Material | Vertical slide transition | | `ZoomPageTransitionsBuilder` | Material | Zoom transition (Material 3 default) | | `PredictiveBackPageTransitionsBuilder` | Material | Android predictive back gesture support | | `CupertinoPageTransitionsBuilder` | **Cupertino** | iOS-style horizontal slide transition | -Previously, `CupertinoPageTransitionsBuilder` was defined in the -Material library alongside the other builders. However, this class -is semantically a Cupertino component—its implementation uses -Cupertino transition mixins and provides iOS-style navigation -animations. +{:.table} -This move improves code organization and allows Cupertino apps to use this -builder without depending on the Material library. +Previously, `CupertinoPageTransitionsBuilder` was defined in +the Material library alongside the other builders. +This class is semantically a Cupertino component because +its implementation uses Cupertino transition mixins and +provides iOS-style navigation animations. + +This move improves code organization and allows Cupertino apps to +use this builder without depending on the Material library. ## Migration guide -If you use `CupertinoPageTransitionsBuilder` and only import -`package:flutter/material.dart`, add an import for -`package:flutter/cupertino.dart`. +If you use `CupertinoPageTransitionsBuilder` and +only import `package:flutter/material.dart`, +add an import for `package:flutter/cupertino.dart`. Code before migration: @@ -82,6 +84,6 @@ In stable release: 3.44 Relevant PRs: -* [Decouple CupertinoPageTransitionsBuilder from Material][] +* [Decouple CupertinoPageTransitionsBuilder from Material][pr-179776] -[Decouple CupertinoPageTransitionsBuilder from Material]: {{site.repo.flutter}}/pull/179776 +[pr-179776]: {{site.repo.flutter}}/pull/179776 diff --git a/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md b/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md index ab93e7980d..c1bcb91f2e 100644 --- a/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md +++ b/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md @@ -9,24 +9,25 @@ description: >- ## Summary -The `onReorder` callback in the `ReorderableListView`, -`ReorderableListView.builder`, `ReorderableList` and `SliverReorderableList` -widgets has been replaced by a new callback, `onReorderItem`, -which provides a more intuitive behavior on index. +The `onReorder` callback in the +`ReorderableListView`, `ReorderableListView.builder`, +`ReorderableList`, and `SliverReorderableList` widgets +has been replaced by a new callback, `onReorderItem`, +which provides more intuitive behavior for `newIndex`. ## Background -The `onReorder` callback in the `ReorderableListView`, -`ReorderableListView.builder`, `ReorderableList` and `SliverReorderableList` -widgets used to require a manual correction -for the second parameter, `newIndex`, -in case the `oldIndex` is before the `newIndex`, -due to the list of items shortening by one element in this case. +The `onReorder` callback in the +`ReorderableListView`, `ReorderableListView.builder`, +`ReorderableList`, and `SliverReorderableList` widgets required +a manual correction for the second parameter, `newIndex`, +in case the `oldIndex` is before the `newIndex` because +the list of items would be shortened by one element. ```dart void handleReorder(int oldIndex, int newIndex) { if (oldIndex < newIndex) { - // Removing the item at oldIndex will shorten the list by 1. + // Removing the item at oldIndex shortens the list by 1. newIndex -= 1; } @@ -38,12 +39,12 @@ ReorderableListView( ) ``` -The new callback, `onReorderItem`, aims to solve this problem, +The new callback, `onReorderItem`, solves this problem by doing the correction automatically. ```dart void handleReorder(int oldIndex, int newIndex) { - // handle the actual reorder behavior... + // Handle the actual reorder behavior... } ReorderableListView( @@ -54,14 +55,13 @@ ReorderableListView( ## Migration guide The `ReorderableListView`, `ReorderableListView.builder`, -`ReorderableList` and `SliverReorderableList` widgets -share the same reordering logic, the migration steps -are identical for any of these widgets. +`ReorderableList`, and `SliverReorderableList` widgets +share the same reordering logic. +The same migration steps apply to each of these widgets. -For the purpose of this migration guide, -`ReorderableListView` is chosen as an example. +This migration guide uses `ReorderableListView` as an example. -### Case 1: trivial case +### Case 1: Simple callbacks {: #case-1-simple-callbacks } Code before migration: @@ -92,13 +92,12 @@ Code after migration: ) ``` -### Case 2: opting out, for complex onReorder implementations +### Case 2: Opt out for complex `onReorder` implementations {: #case-2-opt-out } -In some cases, it might not be obvious how to do the migration -to the new `onReorderItem` callback, -particularly if the provided callback is very complex. +In some cases, such as when the provided callback is complex, +the migration to the new `onReorderItem` callback might not be obvious. -In that case, to opt out of the new behavior, +In these cases, to opt out of the new behavior, adjust the `newIndex` to match the old behavior. Code before migration: @@ -136,7 +135,7 @@ Code after migration: ``` :::important -This migration is not supported by `dart fix`, +This migration isn't supported by `dart fix`, due to the change in meaning for the second callback parameter. ::: @@ -156,18 +155,18 @@ API documentation: Relevant issues: -* [Issue 127901][] -* [Issue 169878][] +* [The index parameter for ReorderableListView's onReorderCallback is confusing][issue-127901] +* [SliverReorderableList newIndex arg off by one on drag down list][issue-169878] Relevant PRs: * [Deprecate onReorder callback][] -[`ReorderCallback`]: {{site.main-api}}/flutter/widgets/ReorderCallback.html -[`ReorderableList`]: {{site.main-api}}/flutter/widgets/ReorderableList-class.html -[`ReorderableListView`]: {{site.main-api}}/flutter/material/ReorderableListView-class.html -[`SliverReorderableList`]: {{site.main-api}}/flutter/widgets/SliverReorderableList-class.html +[`ReorderCallback`]: {{site.api}}/flutter/widgets/ReorderCallback.html +[`ReorderableList`]: {{site.api}}/flutter/widgets/ReorderableList-class.html +[`ReorderableListView`]: {{site.api}}/flutter/material/ReorderableListView-class.html +[`SliverReorderableList`]: {{site.api}}/flutter/widgets/SliverReorderableList-class.html -[Issue 127901]: {{site.repo.flutter}}/issues/127901 -[Issue 169878]: {{site.repo.flutter}}/issues/169878 +[issue-127901]: {{site.repo.flutter}}/issues/127901 +[issue-169878]: {{site.repo.flutter}}/issues/169878 [Deprecate onReorder callback]: {{site.repo.flutter}}/pull/178242 diff --git a/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md b/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md index b782d9be01..128e9dd5e8 100644 --- a/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md +++ b/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md @@ -1,8 +1,8 @@ --- title: Deprecate `TextInputConnection.setStyle` description: >- - The `TextInputConnection.setStyle` method has been deprecated in favor - of the `TextInputConnection.updateStyle` method. + The `TextInputConnection.setStyle` method has been deprecated + in favor of the `TextInputConnection.updateStyle` method. --- {% render "docs/breaking-changes.md" %} @@ -15,19 +15,21 @@ description: >- ## Context -The previous `setStyle` method did not support `letterSpacing`, `wordSpacing`, +The previous `setStyle` method didn't support `letterSpacing`, `wordSpacing`, or `lineHeight`. This caused visual misalignment of the selection highlight and IME caret when these properties were used. -The replacement `updateStyle` method (via `TextInputStyle`) supports these -properties, ensuring the system input is synchronized with the rendered text. +The replacement `updateStyle` method uses +`TextInputStyle` to support these properties, +ensuring the system input is synchronized with the rendered text. ## Migration guide -Authors of custom text input clients should replace calls to -`TextInputConnection.setStyle` with `TextInputConnection.updateStyle`. +If you author a custom text input client, +replace calls to `TextInputConnection.setStyle` +with `TextInputConnection.updateStyle`. -### Code before migration: +### Code before migration ```dart connection.setStyle( @@ -39,7 +41,7 @@ connection.setStyle( ); ``` -### Code after migration: +### Code after migration ```dart connection.updateStyle( @@ -65,11 +67,11 @@ In stable release: 3.44 Relevant PR: -* [PR 180436][] +* [Fix IME and selection by syncing more text styles][pr-180436] Relevant issues: -* [Issue 161592][] +* [Incorrect position of Japanese predictive conversion popup in TextFormField using maxLines on the Web][issue-161592] -[PR 180436]: {{site.repo.flutter}}/pull/180436 -[Issue 161592]: {{site.repo.flutter}}/issues/161592 +[pr-180436]: {{site.repo.flutter}}/pull/180436 +[issue-161592]: {{site.repo.flutter}}/issues/161592 diff --git a/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md b/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md index 088c976f06..1b5c502023 100644 --- a/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md +++ b/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md @@ -1,41 +1,50 @@ --- title: IconData class marked as final description: >- - The IconData class is now marked as final, preventing it from being - extended or implemented. + The IconData class is now marked as final, + preventing it from being extended or implemented. --- {% render "docs/breaking-changes.md" %} ## Summary -The `IconData` class is now marked as `final`, which prevents it from being -implemented or extended. This change is part of an effort to generalize the +The `IconData` class is now marked as [`final`][], +which prevents it from being implemented or extended. +This change is part of an effort to generalize the mechanism for tree-shaking assets and native code. +[`final`]: {{site.dart-site}}/language/class-modifiers#final + ## Background -The Flutter team is working on a generalized mechanism to bring tree-shaking of -assets and native code to packages. The existing bespoke Icon Tree Shaker is +The Flutter team is working on a generalized mechanism to +bring tree-shaking of assets and native code to packages. +The existing bespoke Icon Tree Shaker is being folded into this general mechanism. For performance, locality, and understandability, the general mechanism doesn't -support recording `const` instances in complex type hierarchies. Therefore, -the `IconData` class is now marked as `final`. +support recording `const` instances in complex type hierarchies. +Therefore, the `IconData` class is now marked as `final`. + +Code that implements or extends `IconData` now +fails to compile with the following error: -Code that implements or extends `IconData` fails to compile with an error like: -`The class 'IconData' is 'final' and can't be extended or implemented outside of its library.` +```text +The class 'IconData' is 'final' and can't be extended or implemented outside of its library. +``` ## Migration guide -Instead of implementing `IconData` (for example, using an `enum` to get dot -shorthands, type safety, and an automated `.values` list), use a wrapper class -with `static const` instances. +Instead of implementing `IconData`, +such as with an `enum` that supports dot shorthand, +type safety, and an automated `.values` list, +use a wrapper class with `static const` instances. ### Migrating custom icon types -If you used an `enum` that implements `IconData`, migrate to a class with -`static const` instances and a custom widget. +If you used an `enum` that implements `IconData`, +migrate to a class with `static const` instances and a custom widget. Code before migration: @@ -59,16 +68,16 @@ enum AppIcons implements IconData { final bool matchTextDirection; } -// Usage Widget build(BuildContext context) { + // Example usage of AppIcons: return Icon(AppIcons.arrowUpward); } ``` -Code after migration: +To maintain dot shorthand support and type safety, +use a wrapper class and a custom widget. -To maintain dot shorthand support and type safety, use a wrapper class and a -custom widget: +Code after migration: ```dart final class AppIconData { @@ -96,21 +105,24 @@ class AppIcon extends StatelessWidget { } } -// Usage preserves dot shorthand if the type can be inferred Widget build(BuildContext context) { + // Usage preserves dot shorthand if the type can be inferred: return const AppIcon(AppIconData.arrowUpward); // Or if inferred: const AppIcon(.arrowUpward) } ``` -If you rely on `.values` for tools like Widgetbook, you can maintain the -`values` list manually as shown above or use code generation. +If you rely on `.values` for tools like Widgetbook, +you can maintain the `values` list manually as shown in +the previous example or use code generation. -### Ignoring the mustBeConst lint +### Ignore the `mustBeConst` lint -To enable tree-shaking, some `IconData` parameters are marked with the -`mustBeConst` annotation. If you must use a non-const `IconData` and are willing -to forego tree-shaking for that icon, ignore the lint. +To enable tree-shaking, some `IconData` parameters are +marked with the `mustBeConst` annotation. +If you must use a non-const `IconData` and +are willing to forgo tree-shaking for that icon, +add an ignore comment for the lint. ```dart // ignore: non_const_argument_for_const_parameter @@ -126,13 +138,13 @@ In stable release: 3.44 Relevant PR: -* [PR 181345][] +* [Mark `IconData` `final` and `@mustBeConst`][pr-181345] Relevant issues: -* [Issue 181342][] -* [Issue 181344][] +* [Breaking Change: Marking `class IconData` as `final`][issue-181342] +* [Marking `IconData`'s constructor parameters as `@mustBeConst`][issue-181344] -[PR 181345]: {{site.repo.flutter}}/pull/181345 -[Issue 181342]: {{site.repo.flutter}}/issues/181342 -[Issue 181344]: {{site.repo.flutter}}/issues/181344 +[pr-181345]: {{site.repo.flutter}}/pull/181345 +[issue-181342]: {{site.repo.flutter}}/issues/181342 +[issue-181344]: {{site.repo.flutter}}/issues/181344 diff --git a/sites/docs/src/content/release/breaking-changes/index.md b/sites/docs/src/content/release/breaking-changes/index.md index b6d97d9a9d..ff1825ff29 100644 --- a/sites/docs/src/content/release/breaking-changes/index.md +++ b/sites/docs/src/content/release/breaking-changes/index.md @@ -48,7 +48,7 @@ They're sorted by release and listed in alphabetical order: * [Deprecate `TextInputConnection.setStyle`][] * [Deprecated `cacheExtent` and `cacheExtentStyle`][] * [`IconData` class marked as `final`][] -* [ListTile reports error in debug when wrapped in a colored widget][] +* [ListTile reports an error in debug when wrapped in a colored widget][] * [Migrating Flutter Android projects to built-in Kotlin][] * [Page transition builders reorganization][] @@ -57,7 +57,7 @@ They're sorted by release and listed in alphabetical order: [Deprecated `cacheExtent` and `cacheExtentStyle`]: /release/breaking-changes/scroll-cache-extent [Deprecate `TextInputConnection.setStyle`]: /release/breaking-changes/deprecate-text-input-connection-set-style [`IconData` class marked as `final`]: /release/breaking-changes/icondata-class-marked-final -[ListTile reports error in debug when wrapped in a colored widget]: /release/breaking-changes/list-tile-color-warning +[ListTile reports an error in debug when wrapped in a colored widget]: /release/breaking-changes/list-tile-color-warning [Migrating Flutter Android projects to built-in Kotlin]: /release/breaking-changes/migrate-to-built-in-kotlin [Page transition builders reorganization]: /release/breaking-changes/decouple-page-transition-builders diff --git a/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md b/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md index 15b6580747..42b7293664 100644 --- a/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md +++ b/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md @@ -1,46 +1,51 @@ --- -title: ListTile reports error in debug when wrapped in a colored widget +title: ListTile reports an error in debug when wrapped in a colored widget description: >- - ListTile reports an error in debug mode when it is wrapped in + ListTile now reports an error in debug mode when it is wrapped in an intermediate widget with a non-transparent background color. --- +{% render "docs/breaking-changes.md" %} + ## Summary -When a `ListTile` is wrapped in a widget with a non-transparent background color -(such as a `Container` or `ColoredBox` with a color specified) that sits between -the `ListTile` and its nearest `Material` ancestor, the framework now reports an -error. +When a widget with a non-transparent background color, +such as a `Container` or `ColoredBox` that sets `color`, +sits between a `ListTile` and its nearest `Material` ancestor, +the framework now reports an error. ## Background -`ListTile` paints its background color and ink splashes on the nearest `Material` -ancestor. When a widget with an opaque background color is placed between the -`ListTile` and its `Material` ancestor, it obscures these visual effects, making -them invisible to the user. +`ListTile` paints its background color and ink splashes +on the nearest `Material` ancestor. +When a widget with an opaque background color is +placed between the `ListTile` and its `Material` ancestor, +it obscures these visual effects, +making them invisible to the user. -To prevent developers from accidentally introducing this bug and wondering why -the background or ink splash effects on the `ListTile` are not displaying, an -assert was introduced. This error explicitly points out the issue during -development. +To prevent you from accidentally introducing this bug and +wondering why the background or ink splash effects on +the `ListTile` aren't displaying, +the framework now reports an assertion error during development. -If your code has an intermediate colored widget between a `ListTile` and a -`Material` widget, you will see an error similar to this: +If your code has an intermediate colored widget +between a `ListTile` and a `Material` widget, +you will now see an error similar to this: ```text ListTile background color or ink splashes may be invisible. -The ListTile is wrapped in a Container that has a background color. Because -ListTile paints its background and ink splashes on the nearest Material -ancestor, this Container will hide those effects. To fix this, wrap the ListTile -in its own Material widget, or remove the background color from the intermediate -Container. +The ListTile is wrapped in a Container that has a background color. +Because ListTile paints its background and ink splashes on +the nearest Material ancestor, this Container will hide those effects. +To fix this, wrap the ListTile in its own Material widget, or +remove the background color from the intermediate Container. ``` ## Migration guide -To fix the error, follow the error's hint and either remove the -background color from the intermediate widget, or wrap the `ListTile` in its own -`Material` widget. +To fix the error, +remove the background color from the intermediate widget or +wrap the `ListTile` in its own `Material` widget. Code before migration: @@ -72,7 +77,8 @@ Material( ) ``` -Or you can wrap the `ListTile` in its own `Material` widget directly: +Alternatively, +wrap the `ListTile` in its own `Material` widget: ```dart Container( @@ -101,13 +107,13 @@ API documentation: Relevant issues: -* [Issue 174366][] +* [`ListTile.selectedTileColor` not visible when parent `Container` has explicit background color][issue-174366] Relevant PRs: -* [PR 181402][] +* [Add warning when there is a widget with color between `Material` and `ListTile`][pr-181402] [`ListTile`]: {{site.api}}/flutter/material/ListTile-class.html [`Material`]: {{site.api}}/flutter/material/Material-class.html -[Issue 174366]: {{site.repo.flutter}}/issues/174366 -[PR 181402]: {{site.repo.flutter}}/pull/181402 +[issue-174366]: {{site.repo.flutter}}/issues/174366 +[pr-181402]: {{site.repo.flutter}}/pull/181402 diff --git a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md index d96ca76499..241aa1093c 100644 --- a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md +++ b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md @@ -2,35 +2,40 @@ title: Migrating Flutter Android projects to built-in Kotlin description: >- Update your Flutter Android Gradle files to use built-in Kotlin support. - Essential for migrating projects to Android Gradle Plugin 9.0.0+. + Essential for migrating projects to Android Gradle Plugin 9 or later. --- +{% render "docs/breaking-changes.md" %} + ## Summary -To build a Flutter app for Android, the Android Gradle Plugin (AGP) -must be applied. As of AGP 9.0.0, -the following migrations are required to successfully use AGP 9.0.0+. +To build a Flutter app for Android, +the Android Gradle Plugin (AGP) must be used. +To use AGP 9 and later, the following migrations are required. -First, built-in Kotlin is the new default on AGP 9+, meaning any apps -using the `kotlin-android` plugin (also known as the Kotlin Gradle Plugin -or KGP) will not build successfully [Issue #181383][]. +First, built-in Kotlin is the default in AGP 9 and later. +Apps that use the `kotlin-android` plugin, +also known as the Kotlin Gradle Plugin (KGP), +will fail to build ([Issue #181383][]). However, the Flutter team has added temporary support for the legacy -Kotlin Gradle Plugin (KGP) in AGP 9.0.0+ [Issue #183909][]. +Kotlin Gradle Plugin in AGP 9 and later ([Issue #183909][]). This allows app and plugin developers to safely build their projects regardless of their migration state. -Second, AGP 9.0.0+ will only use the new AGP DSL interfaces. +Second, AGP 9 and later only use the new AGP DSL interfaces. This means any old DSL types will not be recognized. The Flutter team is working on migrating old DSL types to use the new DSL: [Issue #180137][]. -In the meantime, the Flutter team has configured the AGP DSL to be compatible -with the legacy old AGP DSL types [Issue #184838][]. -This ensures app and plugin developers can safely upgrade to AGP 9+. +In the meantime, the Flutter team has configured the AGP DSL +to be compatible with the legacy DSL types ([Issue #184838][]). +This ensures app and plugin developers can +safely upgrade to AGP 9 and later. -To ensure compatibility, all apps and plugins must be manually migrated -from the legacy Kotlin Gradle Plugin (KGP) to built-in Kotlin. -In a future Flutter version, support for applying KGP will be removed -[Issue #184837][]. +To ensure compatibility, +manually migrate all apps and plugins +from the legacy KGP to built-in Kotlin. +Flutter plans to remove support for applying KGP +in a future version ([Issue #184837][]). To learn more about Android Gradle Plugin, see the [Android Gradle Plugin docs][AGP block]. @@ -50,14 +55,14 @@ Follow the [plugin author migration guide][plugin-migration-guide]. ## Next steps -- **Remove Support for KGP:** In a future version of Flutter, - support for applying KGP will be removed [Issue #184837][]. Developers must - migrate their projects (apps, plugins, host app projects) or they will be - unable to build. +- **Remove support for KGP:** + In a future version of Flutter, + support for applying KGP will be removed ([Issue #184837][]). + Migrate apps, plugins, and host apps to keep them building. -- **Remove DSL Gradle Property:** Once the Flutter team - completes the migration to the new AGP DSL, - the Flutter team will remove support for the old DSL [Issue #184839][]. +- **Remove the DSL Gradle property:** + Once the Flutter team completes the migration to the new AGP DSL, + it will remove support for the old DSL ([Issue #184839][]). ## Timeline diff --git a/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md b/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md index b0e7ea4f5f..c85252a7d9 100644 --- a/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md +++ b/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md @@ -1,8 +1,9 @@ --- title: Changing RawMenuAnchor close order description: >- - Closing a `RawMenuAnchor` now triggers `onClose` and `onCloseRequested` callbacks - for all descendant `RawMenuAnchor`s in a coordinated sequence. + Closing a `RawMenuAnchor` now triggers + `onClose` and `onCloseRequested` callbacks for all + descendant `RawMenuAnchor`s in a coordinated sequence. --- {% render "docs/breaking-changes.md" %} @@ -16,16 +17,16 @@ starting from the triggering `RawMenuAnchor` and moving to its descendants, while the `onClose` callback is triggered bottom-up. If a `RawMenuAnchor` is already closed, calls to `MenuController.close` and `MenuController.closeChildren` -will not trigger the `onCloseRequested` callback. +don't trigger the `onCloseRequested` callback. ## Background `RawMenuAnchor` is a low-level widget used to build custom menu systems. -Previously, a `RawMenuAnchor` did not automatically notify its descendants -when it was closed. -Developers were required to manually call `controller.closeChildren()` -within the `onCloseRequested` callback to trigger closure -in descendant `RawMenuAnchor`s. +Previously, a `RawMenuAnchor` didn't automatically +notify its descendants when it was closed. +You had to manually call `controller.closeChildren()` +within the `onCloseRequested` callback +to close descendant `RawMenuAnchor`s. Furthermore, the `onClose` callback timing was inconsistent. A parent `RawMenuAnchor`'s `onClose` could be executed @@ -36,19 +37,19 @@ it subsequently triggers `onCloseRequested` for all of its descendant `RawMenuAnchor`s in a top-down manner. When `hideOverlay` is called from within `onCloseRequested` to close the menu, -all descendant `RawMenuAnchor`s will have their `onClose` callbacks executed -in a bottom-up order. +all descendant `RawMenuAnchor`s have their `onClose` callbacks +executed in a bottom-up order. This means that the most recently opened `RawMenuAnchor` -will have its `onClose` callback executed first, +now has its `onClose` callback executed first, followed by its parent, and so on up the hierarchy. This design allows for a coordinated closing sequence -where child `RawMenuAnchor`s can perform necessary cleanup +where child `RawMenuAnchor`s can perform any necessary cleanup before their parents finalize the closing process. Finally, if a `RawMenuAnchor` is already closed, calls to `MenuController.close` and `MenuController.closeChildren` -will not trigger the `onCloseRequested` callback, +don't trigger the `onCloseRequested` callback, preventing unnecessary callback executions. ## Migration guide @@ -61,15 +62,15 @@ If you have a custom implementation of `onCloseRequested` in a `RawMenuAnchor` containing submenus, `controller.closeChildren()` is now called automatically when the parent menu closes. -You should ensure that your implementation of `onCloseRequested` -still behaves correctly in this context. +Make sure that your implementation of `onCloseRequested` +still behaves correctly with this automatic call. Immediate calls to `controller.closeChildren()` within your -`onCloseRequested` callback are no longer necessary and should be removed. +`onCloseRequested` callback are no longer necessary. +Remove those calls. -Additionally, if your logic relied on the parent's `onClose` callback -firing before its descendants, -you may need to refactor your code to account for the new -bottom-up execution order. +Additionally, if your logic relied on the +parent's `onClose` callback firing before its descendants, +refactor your code to account for the new bottom-up execution order. Code before migration: @@ -81,8 +82,8 @@ RawMenuAnchor( return; } - // Descendant submenus must be closed before the parent menu. This is now - // handled automatically, so this call is no longer necessary. + // Descendant submenus must be closed before the parent menu. + // This is now handled automatically, so this call is no longer necessary. menuController.closeChildren(); animationController.reverse().whenComplete(hideOverlay); }, @@ -104,11 +105,12 @@ RawMenuAnchor( return; } - // menuController.closeChildren() is now called automatically. + // `menuController.closeChildren()` is now called automatically. animationController.reverse().whenComplete(hideOverlay); }, onClose: () { - // This now executes only after all descendant submenus have called onClose(). + // This now executes only after all descendant submenus have + // called `onClose()`. _handleMenuClosed(); }, // ... @@ -128,15 +130,18 @@ In stable release: 3.44 API documentation: -* [`RawMenuAnchor`]({{site.api}}/flutter/widgets/RawMenuAnchor-class.html) -* [`RawMenuAnchor.onCloseRequested`]({{site.api}}/flutter/widgets/RawMenuAnchor/onCloseRequested.html) +* [`RawMenuAnchor`][] +* [`RawMenuAnchor.onCloseRequested`][] Relevant issues: -* [[widgets/raw_menu_anchor.dart] onClose should be called by descendant menus - before parent]({{site.repo.flutter}}/issues/182355) +* [[widgets/raw_menu_anchor.dart] onClose should be called by descendant menus before parent][issue-182355] Relevant PRs: -* [[widgets/raw_menu_anchor.dart] Always onClose and onCloseRequested on - descendants before parent.]({{site.repo.flutter}}/pull/182357) +* [[widgets/raw_menu_anchor.dart] Always onClose and onCloseRequested on descendants before parent.][pr-182357] + +[`RawMenuAnchor`]: {{site.api}}/flutter/widgets/RawMenuAnchor-class.html +[`RawMenuAnchor.onCloseRequested`]: {{site.api}}/flutter/widgets/RawMenuAnchor/onCloseRequested.html +[issue-182355]: {{site.repo.flutter}}/issues/182355 +[pr-182357]: {{site.repo.flutter}}/pull/182357 diff --git a/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md b/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md index 8b0c5c3d34..0fb02b091e 100644 --- a/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md +++ b/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md @@ -9,31 +9,34 @@ description: >- ## Summary -Two properties, `cacheExtent` and `cacheExtentStyle`, are deprecated in scrolling -related widgets (like `ListView`, `GridView`, `CustomScrollView`, `Viewport`) -and their corresponding RenderObjects (like `RenderViewport`). -A new property, `scrollCacheExtent`, has been introduced that encapsulates +Flutter 3.44 deprecates `cacheExtent` and `cacheExtentStyle` +in scrolling-related widgets, such as +`ListView`, `GridView`, `CustomScrollView`, and `Viewport`, +and their corresponding render objects, such as `RenderViewport`. +The new `scrollCacheExtent` property encapsulates both the value and the caching strategy (pixels or viewport). ## Background -Previously, `cacheExtent` was a `double` and `cacheExtentStyle` determined how -that `double` was interpreted (either as pixels or as a fraction of the -viewport). -It also separated the value from its unit, which could be confusing. +Previously, `cacheExtent` was a `double` and +`cacheExtentStyle` determined how that `double` was interpreted +(either as pixels or as a fraction of the viewport). +This split made the setting harder to understand. The new `scrollCacheExtent` property uses a `ScrollCacheExtent` object that -explicitly encapsulates both the value and the caching strategy (pixels or -viewport), ensuring type safety and clearer intent. +explicitly encapsulates both the value and +the caching strategy (pixels or viewport), +which provides type safety and clearer intent. ## Migration guide -### Widget Layer +### Widget layer -#### cacheExtent (Pixels) +#### `cacheExtent` (pixels) -If you were using `cacheExtent` (which defaults to pixels), use `scrollCacheExtent` -with `ScrollCacheExtent.pixels`. +If your code uses `cacheExtent`, +which defaults to pixels, +use `scrollCacheExtent` with `ScrollCacheExtent.pixels`. **Before:** @@ -53,33 +56,36 @@ ListView( ) ``` -#### cacheExtentStyle (Viewport) - -If you were using `cacheExtent` with `CacheExtentStyle.viewport` (commonly used -in `Viewport`), use `scrollCacheExtent` with `ScrollCacheExtent.viewport`. - - **Before:** - - ```dart - Viewport( - cacheExtent: 0.5, - cacheExtentStyle: CacheExtentStyle.viewport, - slivers: // ... - ) - ``` - - **After:** - - ```dart - Viewport( - scrollCacheExtent: const ScrollCacheExtent.viewport(0.5), - slivers: // ... - ) - ``` - -### RenderObject Layer - -If you were manually setting properties on `RenderViewport` or similar, update to use `scrollCacheExtent`. +#### `cacheExtentStyle` (viewport) + +If your code uses `cacheExtent` with `CacheExtentStyle.viewport`, +which is common in `Viewport`, +use `scrollCacheExtent` with `ScrollCacheExtent.viewport`. + +**Before:** + +```dart +Viewport( + cacheExtent: 0.5, + cacheExtentStyle: CacheExtentStyle.viewport, + slivers: // ... +) +``` + +**After:** + +```dart +Viewport( + scrollCacheExtent: const ScrollCacheExtent.viewport(0.5), + slivers: // ... +) +``` + +### Render object layer + +If your code manually sets properties on +`RenderViewport` or a similar render object, +use `scrollCacheExtent`. **Before:** @@ -109,10 +115,10 @@ API documentation: Relevant PRs: -* [Introduce ScrollCacheExtent][] +* [Introduce ScrollCacheExtent][pr-181092] [`ScrollCacheExtent`]: {{site.api}}/flutter/rendering/ScrollCacheExtent-class.html [`ScrollView.scrollCacheExtent`]: {{site.api}}/flutter/widgets/ScrollView/scrollCacheExtent.html [`RenderViewportBase.scrollCacheExtent`]: {{site.api}}/flutter/rendering/RenderViewportBase/scrollCacheExtent.html -[Introduce ScrollCacheExtent]: {{site.repo.flutter}}/pull/181092 +[pr-181092]: {{site.repo.flutter}}/pull/181092 From 693760014fe73617c942550fda24ba3a4ddcd735 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 19 May 2026 20:18:07 -0500 Subject: [PATCH 21/28] Deduplicate install structions from archive page (#13408) We don't want to duplicate installation instructions if not necessary. If a developer visiting the archive doesn't know how to install it, we can direct them to the dedicated page on [how to install Flutter manually](https://docs.flutter.dev/install/manual). --- sites/docs/src/content/install/archive.md | 38 ++++++++--------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/sites/docs/src/content/install/archive.md b/sites/docs/src/content/install/archive.md index 05cbe6166c..80eebfaa1b 100644 --- a/sites/docs/src/content/install/archive.md +++ b/sites/docs/src/content/install/archive.md @@ -12,6 +12,9 @@ The Flutter SDK archive is a collection of all previous versions of the Flutter SDK. This archive is useful for developers who need to use an older version of Flutter for compatibility reasons or to investigate bugs. +After you download a release, to set up Flutter, +follow the [manual installation instructions][manual-install]. + The archive includes Flutter SDKs for Windows, macOS, and Linux on the following [channels][]: @@ -53,27 +56,6 @@ SDK archive: [calendar versioning]: https://calver.org/ [Flutter SDK versioning]: {{site.repo.flutter}}/blob/main/docs/releases/Release-versioning.md -## Install from an archive - -After downloading a Flutter SDK archive from this page, -use the following steps to install: - -1. Extract the downloaded archive to a desired location on your system. -2. Add the Flutter `bin` directory to your system's `PATH`. For more information, - see [Add Flutter to PATH](/install/add-to-path). -3. Run the following command to verify the installation: - -```bash id="yfl9s6" -flutter doctor -``` - -The `flutter doctor` command checks your environment -and reports on the status of your installation. - -For detailed platform-specific setup instructions, -refer to the main [Flutter installation guide](../install). - - ## Public release windows Predictability is key to landing complex features safely. @@ -159,15 +141,21 @@ $ git clone -b main https://github.com/flutter/flutter.git $ ./flutter/bin/flutter --version ``` + + ## More information -To learn what's new in the major Flutter builds, check out the -[release notes][] page. +- For instructions on installing Flutter from a downloaded SDK, + see [Install Flutter manually][manual-install]. + +- To learn what's new in the major Flutter builds, + check out the [release notes][] page. -For details on how our installation bundles are structured, -see [Installation bundles][]. +- For details on how our installation bundles are structured, + see [Installation bundles][]. [channels]: {{site.repo.flutter}}/blob/main/docs/releases/Flutter-build-release-channels.md +[manual-install]: /install/manual [release notes]: /release/release-notes [GitHub repo]: {{site.repo.flutter}} [Installation bundles]: {{site.repo.flutter}}/blob/main/docs/infra/Flutter-Installation-Bundles.md From a4cc6433071548646565c63e2307bc69d7cd3cd9 Mon Sep 17 00:00:00 2001 From: jesswrd Date: Tue, 19 May 2026 18:18:55 -0700 Subject: [PATCH 22/28] Added built-in kotlin migration workaround for plugin authors (#13407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a plugin cannot be bumped to a minimum Flutter sdk version of 3.44 (the current stable), then they must follow this workaround to support apps on AGP < 9 and AGP >= 9. We added support for apps on AGP < 9 and AGP >= 9 in 3.44. For some context, some plugins may have restrictions on the minimum Flutter SDK. For example, our own Flutter plugins can be bumped to a highest minimum Flutter SDK of version stable-1. ## Presubmit checklist - [x] If you are unwilling, or unable, to sign the CLA, even for a _tiny_, one-word PR, please file an issue instead of a PR. - [x] If this PR is not meant to land until a future stable release, mark it as draft with an explanation. - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style)—for example, it doesn't use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first-person pronouns). - [ ] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --- .../for-plugin-authors.md | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md index 8762262721..e2c783c8ba 100644 --- a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md +++ b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md @@ -10,6 +10,11 @@ This guide outlines the migration steps specifically for plugin authors. ### Update the Gradle file +The following steps assume you can update your plugin's Flutter SDK minimum +to 3.44. If you cannot update the Flutter SDK minimum to 3.44, follow the +instructions for +[supporting Flutter versions earlier than 3.44][flutter-sdk-minimum-below-3.44]. + First, find the `kotlin-android` plugin (or the `org.jetbrains.kotlin.android` plugin). It is likely located in the `plugins` block of the @@ -200,6 +205,190 @@ environment: # ... ``` +## Supporting Flutter versions earlier than 3.44 + +If you updated your plugin's Flutter SDK minimum to 3.44, skip this section +and proceed to updating the plugin's `CHANGELOG.md`. + +If you cannot update the plugin's Flutter SDK minimum to 3.44, you must make +the following changes to `/android/build.gradle` or +`/android/build.gradle.kts` to support apps on AGP < 9 +and AGP >= 9: + + + + +**Before**: + +```kotlin title="/android/build.gradle.kts" +plugins { + id("com.android.library") + id("kotlin-android") + // ... +} + +android { + // ... + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + // ... +} + +// ... +``` + +Next, remove the `kotlin-android` plugin and the `kotlinOptions` block: + +```kotlin diff title="/android/build.gradle.kts" + plugins { + id("com.android.library") +- id("kotlin-android") + // ... + } + + android { + // ... +- kotlinOptions { +- jvmTarget = JavaVersion.VERSION_17.toString() +- } + // ... + } +``` + +Add a check to apply the Kotlin Gradle Plugin only when the app's Android +Gradle Plugin version is earlier than 9. + +```kotlin diff title="/android/build.gradle.kts" ++ val agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.substringBefore('.').toInt() ++ ++ if (agpMajor < 9) { ++ apply(plugin = "org.jetbrains.kotlin.android") ++ } +``` + +Add the `compilerOptions` configuration using the project extension: + +```kotlin diff title="/android/build.gradle.kts" ++ project.extensions.configure(org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension::class.java) { ++ compilerOptions { ++ jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 ++ } ++ } +``` + +Here is how the file will likely end up: + +**After**: + +```kotlin title="/android/build.gradle.kts" +plugins { + id("com.android.library") + // ... +} + +val agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.substringBefore('.').toInt() + +if (agpMajor < 9) { + apply(plugin = "org.jetbrains.kotlin.android") +} + +android { + // ... +} + +project.extensions.configure(org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension::class.java) { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + +// ... +``` + + + + +**Before**: + +```groovy title="/android/build.gradle" +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + // ... + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + // ... +} + +// ... +``` + +Next, remove the `kotlin-android` plugin and the `kotlinOptions` block: + +```groovy diff title="/android/build.gradle" +apply plugin: 'com.android.library' +- apply plugin: 'kotlin-android' + + android { + // ... +- kotlinOptions { +- jvmTarget = JavaVersion.VERSION_17.toString() +- } + // ... + } +``` + +Add a check to apply the Kotlin Gradle Plugin only when the app's Android +Gradle Plugin version is earlier than 9. + +```groovy diff title="/android/build.gradle" ++ def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0] as int ++ ++ if (agpMajor < 9) { ++ apply plugin: 'kotlin-android' ++ } +``` + +Add the `kotlin.compilerOptions{}` DSL block with the following: + +```groovy diff title="/android/build.gradle" ++ kotlin { ++ compilerOptions { ++ jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 ++ } ++ } +``` + +Here is how the file will likely end up: + +**After**: + +```groovy title="/android/build.gradle" +apply plugin: 'com.android.library' + +def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0] as int +if (agpMajor < 9) { + apply plugin: 'kotlin-android' +} + +android { + // ... +} + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + +// ... +``` + + + ### Update the plugin's `CHANGELOG.md` Include your changes in the CHANGELOG of the newly released plugin version: @@ -224,3 +413,4 @@ then you will also have to migrate the example app. Follow the [migration guide for app developers][app-migration-guide] to migrate your example app. [app-migration-guide]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-app-developers +[flutter-sdk-minimum-below-3.44]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors#supporting-flutter-versions-earlier-than-3-44 From da09df7476aa7cdf9eedb4bcad2f13888cf75517 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 19 May 2026 20:19:58 -0500 Subject: [PATCH 23/28] Migrate deploy and stage to be implemented in Dart (#13406) Migrates docs site production deploys and staging previews from a Cloud Build shell script to first-class `dash_site` Dart commands for easier maintenance, expansion to multiple sites, and direct use by contributors. This adds `dart run dash_site deploy` for production Firebase Hosting deploys and `dart run dash_site stage-preview` for preview channel deploys. The staging command builds the selected site, deploys it to a Firebase Hosting preview channel, extracts the preview URL from Firebase's JSON output, and creates or updates a GitHub PR comment using the GitHub API through `package:github`. The Cloud Build deploy and stage configs now call these Dart commands directly, support a `_SITE` substitution, and pass PR metadata into the staging command. > [!NOTE] > The code is a bit longer but it's easier to maintain and understand in Dart, more flexible, and enables contributors to deploy to their own projects. As we soon expand to support deploying and staging multiple sites, the shell scripts would have became much more complicated, so this also prepares for that. Contributes to https://github.com/flutter/website/issues/13148 --- cloud_build/deploy.yaml | 12 +- .../stage_site_and_comment_on_github.sh | 34 -- cloud_build/stage.yaml | 25 +- tool/dash_site/lib/dash_site.dart | 4 + .../lib/src/commands/check_links.dart | 10 +- tool/dash_site/lib/src/commands/deploy.dart | 83 ++++ .../lib/src/commands/stage_preview.dart | 375 ++++++++++++++++++ tool/dash_site/lib/src/firebase.dart | 64 +++ tool/dash_site/lib/src/sites.dart | 8 + tool/dash_site/pubspec.yaml | 1 + 10 files changed, 561 insertions(+), 55 deletions(-) delete mode 100755 cloud_build/scripts/stage_site_and_comment_on_github.sh create mode 100644 tool/dash_site/lib/src/commands/deploy.dart create mode 100644 tool/dash_site/lib/src/commands/stage_preview.dart create mode 100644 tool/dash_site/lib/src/firebase.dart diff --git a/cloud_build/deploy.yaml b/cloud_build/deploy.yaml index 6cc3207a5d..39568125a9 100644 --- a/cloud_build/deploy.yaml +++ b/cloud_build/deploy.yaml @@ -1,17 +1,19 @@ +substitutions: + _SITE: docs steps: - name: gcr.io/cloud-builders/git args: ['fetch', '--unshallow'] - name: gcr.io/flutter-dev-230821/firebase-ghcli - # Build the site, then deploy it to production. + # Build the selected site, then deploy it to production. entrypoint: '/bin/bash' args: - '-c' - |- - set -e + set -euo pipefail dart pub get - dart run dash_site build --release - - firebase deploy --project=flutter-docs-prod --only=hosting + dart run dash_site --site="$${SITE}" deploy + env: + - 'SITE=$_SITE' options: logging: CLOUD_LOGGING_ONLY diff --git a/cloud_build/scripts/stage_site_and_comment_on_github.sh b/cloud_build/scripts/stage_site_and_comment_on_github.sh deleted file mode 100755 index 55be4263d0..0000000000 --- a/cloud_build/scripts/stage_site_and_comment_on_github.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -set -e - -deploy_to_firebase_staging_channel () { - echo "Deploying website to a staging channel on firebase..." - - # Deploy to firebase, but save the output to a variable so we can grep the - # url from the output and save it to FIREBASE_STAGING_URL for future use. - FIREBASE_DEPLOY_RESPONSE=$(firebase hosting:channel:deploy --expires 7d pr$PR_NUMBER-$HEAD_BRANCH --project=$PROJECT_ID) - echo "$FIREBASE_DEPLOY_RESPONSE" - FIREBASE_STAGING_URL=$(grep -Eo "https://$PROJECT_ID--[a-zA-Z0-9./?=_%:-]*" <<< "$FIREBASE_DEPLOY_RESPONSE") -} - -login_to_github() { - echo "Logging into github under bot account..." - - echo $GH_PAT_TOKEN > token - gh auth login --with-token < token -} - -comment_staging_url_on_github () { - echo "Commenting staging url on the PR..." - COMMENT_BODY=$(echo -e "Visit the preview URL for this PR (updated for commit $COMMIT_SHA):\n\n$FIREBASE_STAGING_URL") - - # The github CLI throws an error if --edit-last doesn't find a previous - # comment, so this edits the last comment, but if it doesn't exist, - # leave a new comment. - gh pr comment $PR_NUMBER --edit-last --body "$COMMENT_BODY" --repo $REPO_FULL_NAME || \ - gh pr comment $PR_NUMBER --body "$COMMENT_BODY" --repo $REPO_FULL_NAME -} - -deploy_to_firebase_staging_channel -login_to_github -comment_staging_url_on_github diff --git a/cloud_build/stage.yaml b/cloud_build/stage.yaml index ffd70b9542..c8684bb5a1 100644 --- a/cloud_build/stage.yaml +++ b/cloud_build/stage.yaml @@ -1,26 +1,31 @@ +substitutions: + _SITE: docs steps: - name: gcr.io/flutter-dev-230821/firebase-ghcli - # Build the site, deploy it to staging, then comment the link on the PR. + # Build the selected site, deploy it to staging, then comment the link. entrypoint: '/bin/bash' args: - '-c' - |- - set -e + set -euo pipefail dart pub get - dart run dash_site build - - cloud_build/scripts/stage_site_and_comment_on_github.sh - secretEnv: ['GH_PAT_TOKEN'] + dart run dash_site --site="$${SITE}" stage-preview \ + --pr-number "$${PR_NUMBER}" \ + --repo "$${REPO_FULL_NAME}" \ + --commit-sha "$${COMMIT_SHA}" \ + --head-branch "$${HEAD_BRANCH}" env: + - 'SITE=$_SITE' - 'PR_NUMBER=$_PR_NUMBER' - - 'HEAD_BRANCH=$_HEAD_BRANCH' - - 'PROJECT_ID=$PROJECT_ID' - - 'COMMIT_SHA=$COMMIT_SHA' - 'REPO_FULL_NAME=$REPO_FULL_NAME' + - 'COMMIT_SHA=$COMMIT_SHA' + - 'HEAD_BRANCH=$_HEAD_BRANCH' + secretEnv: ['GH_PAT_TOKEN'] availableSecrets: secretManager: - - versionName: projects/$PROJECT_ID/secrets/flutter-website-bot-comment-pat/versions/latest + # Use flutter-docs-prod across sites, so we only need a single bot setup. + - versionName: projects/flutter-docs-prod/secrets/flutter-website-bot-comment-pat/versions/latest env: 'GH_PAT_TOKEN' timeout: 1200s options: diff --git a/tool/dash_site/lib/dash_site.dart b/tool/dash_site/lib/dash_site.dart index 77f556bf18..c81144bc65 100644 --- a/tool/dash_site/lib/dash_site.dart +++ b/tool/dash_site/lib/dash_site.dart @@ -10,9 +10,11 @@ import 'src/commands/check_all.dart'; import 'src/commands/check_link_references.dart'; import 'src/commands/check_links.dart'; import 'src/commands/clean.dart'; +import 'src/commands/deploy.dart'; import 'src/commands/format_dart.dart'; import 'src/commands/refresh_excerpts.dart'; import 'src/commands/serve.dart'; +import 'src/commands/stage_preview.dart'; import 'src/commands/test_dart.dart'; import 'src/commands/verify_firebase_json.dart'; import 'src/sites.dart'; @@ -40,9 +42,11 @@ final class DashSiteCommandRunner extends CommandRunner { addCommand(CheckLinksCommand()); addCommand(CheckLinkReferencesCommand()); addCommand(CleanSiteCommand()); + addCommand(DeployCommand()); addCommand(FormatDartCommand()); addCommand(RefreshExcerptsCommand()); addCommand(ServeSiteCommand()); + addCommand(StagePreviewCommand()); addCommand(TestDartCommand()); addCommand(VerifyFirebaseJsonCommand()); } diff --git a/tool/dash_site/lib/src/commands/check_links.dart b/tool/dash_site/lib/src/commands/check_links.dart index 3a4c7394f0..17b9217eb9 100644 --- a/tool/dash_site/lib/src/commands/check_links.dart +++ b/tool/dash_site/lib/src/commands/check_links.dart @@ -9,6 +9,7 @@ import 'package:args/command_runner.dart'; import 'package:linkcheck/linkcheck.dart' as linkcheck show run; import 'package:path/path.dart' as path; +import '../firebase.dart'; import '../sites.dart'; import '../utils.dart'; @@ -58,11 +59,8 @@ Future _checkLinks({ return 1; } - final toolVersionOutput = await Process.run('firebase', const ['--version']); - - final firebaseToolsVersion = (toolVersionOutput.stdout as String?)?.trim(); - if (firebaseToolsVersion == null || firebaseToolsVersion.isEmpty) { - stderr.writeln('Error: Could not determine firebase-tools version!'); + final firebaseToolsVersion = await validateFirebaseCli(); + if (firebaseToolsVersion == null) { return 1; } @@ -76,7 +74,7 @@ Future _checkLinks({ ); final firebaseConfigFileName = path.basename(site.firebaseConfigPath); final emulatorProcess = await Process.start( - 'firebase', + firebaseCliExecutable, [ 'emulators:start', '--only', diff --git a/tool/dash_site/lib/src/commands/deploy.dart b/tool/dash_site/lib/src/commands/deploy.dart new file mode 100644 index 0000000000..08ad3ef73d --- /dev/null +++ b/tool/dash_site/lib/src/commands/deploy.dart @@ -0,0 +1,83 @@ +// Copyright 2026 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:args/command_runner.dart'; +import 'package:path/path.dart' as path; + +import '../firebase.dart'; +import '../sites.dart'; +import '../utils.dart'; +import 'build.dart'; + +/// Builds and deploys the selected site to Firebase Hosting. +final class DeployCommand extends Command { + static const String _projectOption = 'project'; + static const String _onlyOption = 'only'; + + DeployCommand() { + argParser + ..addOption( + _projectOption, + help: + 'The Firebase project ID or alias to deploy to. ' + 'Defaults to the selected site production project. ' + 'Use this to test deploys against a personal Firebase project.', + valueHelp: 'project-id', + ) + ..addOption( + _onlyOption, + defaultsTo: 'hosting', + help: + 'The Firebase deploy target. ' + 'Use "hosting:target" for projects with multiple Hosting targets.', + valueHelp: 'hosting[:target]', + ); + } + + @override + String get description => + 'Build a production release of the site and ' + 'deploy it to Firebase Hosting.'; + + @override + String get name => 'deploy'; + + @override + Future run() async { + final selectedSite = this.selectedSite; + final argResults = this.argResults!; + final project = + argResults.option(_projectOption) ?? + selectedSite.defaultFirebaseProjectId; + final only = argResults.option(_onlyOption)!; + + final firebaseToolsVersion = await validateFirebaseCli(); + if (firebaseToolsVersion == null) { + return 1; + } + + if (await buildSite(selectedSite, productionRelease: true) + case final buildResult when buildResult != 0) { + return buildResult; + } + + print('Using firebase-tools $firebaseToolsVersion.'); + print( + 'Deploying ${selectedSite.host} to Firebase project $project ' + 'with target $only...', + ); + final deploy = await Process.start( + firebaseCliExecutable, + ['deploy', '--project=$project', '--only=$only'], + workingDirectory: path.join( + repositoryRoot, + selectedSite.firebaseConfigDirectory, + ), + mode: ProcessStartMode.inheritStdio, + ); + return deploy.exitCode; + } +} diff --git a/tool/dash_site/lib/src/commands/stage_preview.dart b/tool/dash_site/lib/src/commands/stage_preview.dart new file mode 100644 index 0000000000..a87c76aeb2 --- /dev/null +++ b/tool/dash_site/lib/src/commands/stage_preview.dart @@ -0,0 +1,375 @@ +// Copyright 2026 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +import 'package:args/command_runner.dart'; +import 'package:github/github.dart' as github; +import 'package:path/path.dart' as path; + +import '../firebase.dart'; +import '../sites.dart'; +import '../utils.dart'; +import 'build.dart'; + +/// Builds the selected or default site, +/// deploys it to a Firebase Hosting preview channel, +/// and posts or updates a comment on the source GitHub PR when requested. +final class StagePreviewCommand extends Command { + static const String _projectOption = 'project'; + static const String _channelOption = 'channel'; + static const String _expiresOption = 'expires'; + static const String _prNumberOption = 'pr-number'; + static const String _repoOption = 'repo'; + static const String _commitShaOption = 'commit-sha'; + static const String _headBranchOption = 'head-branch'; + + StagePreviewCommand() { + argParser + ..addOption( + _projectOption, + help: + 'The Firebase project ID or alias to stage to. ' + 'Defaults to the selected site production project. ' + 'Use this to test previews against a personal Firebase project.', + valueHelp: 'project-id', + ) + ..addOption( + _channelOption, + help: + 'The Firebase Hosting preview channel name. ' + 'Defaults to a stable name based on the selected site and PR.', + valueHelp: 'channel', + ) + ..addOption( + _expiresOption, + defaultsTo: '7d', + help: 'How long the Firebase Hosting preview channel should live.', + valueHelp: 'duration', + ) + ..addOption( + _prNumberOption, + help: + 'The pull request number to comment on. ' + 'Required together with --$_repoOption to post a preview comment.', + ) + ..addOption( + _repoOption, + help: + 'The full repository name in "owner/repository" form. ' + 'Required together with --$_prNumberOption to ' + 'post a preview comment.', + valueHelp: 'owner/repository', + ) + ..addOption( + _commitShaOption, + help: + 'The commit SHA being staged. ' + 'Required to post a preview comment.', + ) + ..addOption( + _headBranchOption, + help: 'The branch name to include in the staging channel name.', + ); + } + + @override + String get description => + 'Build the site, deploy it to a Firebase staging channel, ' + 'and comment the preview URL on GitHub.'; + + @override + String get name => 'stage-preview'; + + @override + Future run() async { + final selectedSite = this.selectedSite; + final argResults = this.argResults!; + + final project = + argResults.option(_projectOption) ?? + selectedSite.defaultFirebaseProjectId; + final channel = _nonEmpty(argResults.option(_channelOption)); + final expires = argResults.option(_expiresOption)!; + final prNumberArg = _nonEmpty(argResults.option(_prNumberOption)); + final repoFullName = _nonEmpty(argResults.option(_repoOption)); + final commitSha = _nonEmpty(argResults.option(_commitShaOption)); + final headBranch = _nonEmpty(argResults.option(_headBranchOption)); + + // Validate PR-context preconditions up front so a misconfigured + // trigger fails before the build and deploy runs unnecessarily. + final _PullRequestContext? prContext; + if (prNumberArg != null && repoFullName != null) { + final prNumber = int.tryParse(prNumberArg); + if (prNumber == null) { + stderr.writeln('Error: --$_prNumberOption must be an integer.'); + return 1; + } + if (!repoFullName.contains('/')) { + stderr.writeln( + 'Error: --$_repoOption must be in the form "owner/repository".', + ); + return 1; + } + if (commitSha == null) { + stderr.writeln( + 'Error: --$_commitShaOption must be set to ' + 'comment on the pull request.', + ); + return 1; + } + const githubPatTokenEnv = 'GH_PAT_TOKEN'; + final githubToken = _nonEmpty(Platform.environment[githubPatTokenEnv]); + if (githubToken == null) { + stderr.writeln( + 'Error: $githubPatTokenEnv must be set to ' + 'comment on the pull request.', + ); + return 1; + } + prContext = ( + prNumber: prNumber, + repoFullName: repoFullName, + githubToken: githubToken, + commitSha: commitSha, + ); + } else { + if (prNumberArg != null || repoFullName != null) { + stderr.writeln( + 'Warning: Both --$_prNumberOption and --$_repoOption must be set ' + 'to comment on the pull request; skipping the GitHub comment.', + ); + } + prContext = null; + } + + final firebaseToolsVersion = await validateFirebaseCli(); + if (firebaseToolsVersion == null) { + return 1; + } + + if (await buildSite(selectedSite, productionRelease: false) + case final buildResult when buildResult != 0) { + return buildResult; + } + + print('Using firebase-tools $firebaseToolsVersion.'); + final branchOrSha = headBranch ?? commitSha ?? 'manual'; + final stagingUrl = await _deploySiteToStaging( + selectedSite, + project: project, + channel: + channel ?? + _firebaseChannelForSite( + selectedSite, + prNumber: prNumberArg, + branchOrSha: branchOrSha, + ), + expires: expires, + ); + if (stagingUrl == null) { + return 1; + } + + if (prContext == null) { + print('No pull request context available; skipping GitHub comment.'); + print(stagingUrl); + return 0; + } + + return _commentStagingUrlOnGitHub( + site: selectedSite, + stagingUrl: stagingUrl, + context: prContext, + ); + } +} + +/// Deploys [site] to a Firebase Hosting preview channel and +/// returns the channel's public URL on success, or +/// `null` if the deploy fails or no URL can be extracted. +Future _deploySiteToStaging( + Site site, { + required String project, + required String channel, + required String expires, +}) async { + print( + 'Deploying ${site.host} to Firebase project $project ' + 'preview channel $channel...', + ); + + final result = await Process.run( + firebaseCliExecutable, + [ + 'hosting:channel:deploy', + channel, + '--project=$project', + '--expires', + expires, + '--json', + ], + workingDirectory: path.join(repositoryRoot, site.firebaseConfigDirectory), + ); + + if (result.exitCode != 0) { + stderr.writeln(result.stderr); + stderr.writeln(result.stdout); + return null; + } + + stdout.write(result.stdout); + stderr.write(result.stderr); + + final stagingUrl = _extractDeployedUrl(result.stdout as String); + if (stagingUrl == null) { + stderr.writeln('Failed to find a Firebase staging URL for ${site.host}.'); + return null; + } + + return stagingUrl; +} + +/// Extracts the deployed preview URL from +/// `firebase hosting:channel:deploy --json` output. +/// +/// Returns `null` if the input isn't valid JSON or doesn't contain a URL. +String? _extractDeployedUrl(String firebaseJsonOutput) { + final Object? parsed; + try { + parsed = jsonDecode(firebaseJsonOutput); + } on FormatException { + return null; + } + if (parsed case { + 'result': final Map result, + }) { + for (final entry in result.values) { + if (entry case {'url': final String url}) { + return url; + } + } + } + return null; +} + +/// Posts a new preview comment on the pull request, +/// or updates the existing one identified by an HTML marker that +/// includes the [site]'s name. +/// +/// Returns `0` on success or `1` if the GitHub API call fails. +Future _commentStagingUrlOnGitHub({ + required Site site, + required String stagingUrl, + required _PullRequestContext context, +}) async { + final commentMarker = ''; + final commentBody = + ''' +$commentMarker +Staged preview of the updated ${site.host} site (updated for commit ${context.commitSha}): + +$stagingUrl'''; + + print('Commenting ${site.host} staging URL on the PR...'); + final gitHub = github.GitHub( + auth: github.Authentication.withToken(context.githubToken), + ); + try { + final repository = github.RepositorySlug.full(context.repoFullName); + final existingCommentId = await _findExistingPreviewCommentId( + gitHub: gitHub, + repository: repository, + issueNumber: context.prNumber, + commentMarker: commentMarker, + ); + + if (existingCommentId == null) { + await gitHub.issues.createComment( + repository, + context.prNumber, + commentBody, + ); + } else { + // package:github's IssuesService.updateComment issues a POST, + // but GitHub's REST API requires PATCH for this endpoint. + await gitHub.request( + 'PATCH', + '/repos/${repository.fullName}/issues/comments/$existingCommentId', + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({'body': commentBody}), + statusCode: github.StatusCodes.OK, + ); + } + } on github.GitHubError catch (error) { + stderr.writeln('Error: Failed to comment on the pull request: $error'); + return 1; + } finally { + gitHub.dispose(); + } + + return 0; +} + +/// Returns the id of the first comment on the issue whose body +/// contains the specified [commentMarker]. +/// +/// Returns `null` if no matching comment exists. +Future _findExistingPreviewCommentId({ + required github.GitHub gitHub, + required github.RepositorySlug repository, + required int issueNumber, + required String commentMarker, +}) async { + await for (final comment in gitHub.issues.listCommentsByIssue( + repository, + issueNumber, + )) { + if (comment.body?.contains(commentMarker) ?? false) { + return comment.id; + } + } + return null; +} + +/// Builds a Firebase Hosting channel name for [site] that +/// incorporates [branchOrSha] and if specified, [prNumber], +/// and satisfies Firebase's naming constraints: +/// +/// - Lowercase a-z characters, 0-9 digits, and dashes (`-`). +/// - No longer than 63 characters. +/// - No trailing dashes. +String _firebaseChannelForSite( + Site site, { + String? prNumber, + required String branchOrSha, +}) { + final prefix = prNumber != null ? 'pr$prNumber-' : ''; + var channel = '${site.name}-$prefix$branchOrSha'.toLowerCase().replaceAll( + RegExp('[^a-z0-9-]+'), + '-', + ); + if (channel.length > 63) { + channel = channel.substring(0, 63); + } + return channel.replaceAll(RegExp(r'-+$'), ''); +} + +/// Returns [value] if it is non-null and non-empty, otherwise `null`. +String? _nonEmpty(String? value) { + if (value == null || value.isEmpty) return null; + return value; +} + +/// Everything required to post a preview comment on a GitHub pull request. +/// +/// Built during option parsing so that a misconfigured Cloud Build trigger +/// fails before the build and deploy runs. +typedef _PullRequestContext = ({ + int prNumber, + String repoFullName, + String githubToken, + String commitSha, +}); diff --git a/tool/dash_site/lib/src/firebase.dart b/tool/dash_site/lib/src/firebase.dart new file mode 100644 index 0000000000..84c98975ef --- /dev/null +++ b/tool/dash_site/lib/src/firebase.dart @@ -0,0 +1,64 @@ +// Copyright 2026 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +/// The executable name for the Firebase CLI. +const String firebaseCliExecutable = 'firebase'; + +/// Validates that the Firebase CLI is available and returns its version. +/// +/// Returns `null` and prints actionable feedback if the CLI isn't available +/// or can't report its version. +Future validateFirebaseCli() async { + final ProcessResult versionResult; + try { + versionResult = await Process.run(firebaseCliExecutable, const [ + '--version', + ]); + } on ProcessException catch (error) { + stderr.writeln( + 'Error: The Firebase CLI is required, but ' + '`firebase --version` could not run.', + ); + stderr.writeln(_firebaseCliInstallMessage); + if (error.message.isNotEmpty) { + stderr.writeln(error.message); + } + return null; + } + + if (versionResult.exitCode != 0) { + stderr.writeln( + 'Error: The Firebase CLI is required, but ' + '`firebase --version` failed.', + ); + _writeErrorOutput(versionResult.stdout); + _writeErrorOutput(versionResult.stderr); + stderr.writeln(_firebaseCliInstallMessage); + return null; + } + + final version = versionResult.stdout.toString().trim(); + if (version.isEmpty) { + stderr.writeln('Error: Could not determine firebase-tools version.'); + stderr.writeln(_firebaseCliInstallMessage); + return null; + } + + return version; +} + +/// Help text shown when the Firebase CLI can't be validated. +const String _firebaseCliInstallMessage = + 'Install firebase-tools and make sure the `firebase` executable is ' + 'available on your PATH.'; + +/// Writes [output] to stderr if it contains non-whitespace content. +void _writeErrorOutput(Object? output) { + final trimmedOutput = output?.toString().trim() ?? ''; + if (trimmedOutput.isNotEmpty) { + stderr.writeln(trimmedOutput); + } +} diff --git a/tool/dash_site/lib/src/sites.dart b/tool/dash_site/lib/src/sites.dart index b7a0b01289..bb8fa06db9 100644 --- a/tool/dash_site/lib/src/sites.dart +++ b/tool/dash_site/lib/src/sites.dart @@ -14,6 +14,7 @@ enum Site { contentPathSegments: ['src', 'content'], firebaseConfigPathSegments: ['firebase.json'], firebaseEmulatorPort: 5502, + defaultFirebaseProjectId: 'flutter-docs-prod', supportsCodeExcerpts: true, ); @@ -23,6 +24,7 @@ enum Site { required this.contentPathSegments, required this.firebaseConfigPathSegments, required this.firebaseEmulatorPort, + required this.defaultFirebaseProjectId, this.supportsCodeExcerpts = false, }); @@ -51,6 +53,12 @@ enum Site { /// and `5000` must be avoided since AirPlay can use it on macOS. final int firebaseEmulatorPort; + /// The default Firebase project ID for production and staging deploys. + /// + /// Commands expose this as an overrideable default so contributors can + /// deploy the site to their own Firebase projects for testing. + final String defaultFirebaseProjectId; + /// Whether this site supports code excerpts managed by `refresh-excerpts`. final bool supportsCodeExcerpts; diff --git a/tool/dash_site/pubspec.yaml b/tool/dash_site/pubspec.yaml index 1907d314d1..3afb34a8f5 100644 --- a/tool/dash_site/pubspec.yaml +++ b/tool/dash_site/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: args: ^2.7.0 excerpter: path: ../../packages/excerpter + github: ^9.25.0 io: ^1.0.5 linkcheck: ^3.1.0 path: ^1.9.1 From a43b0e7d3092b64db4933397aaddaed41f333ba1 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 19 May 2026 20:20:44 -0500 Subject: [PATCH 24/28] [3.44] Update supported and tested deployment platforms (#13399) Updates the versions identified on the [Supported deployment platforms page](https://docs.flutter.dev/reference/supported-platforms) for Flutter 3.44 . - macOS - Updated CI-tested version from `Sonoma (14), Sequoia (15)` to just `Sequoia (15)`. - Debian - Updated supported versions from `10, 11, 12` to `10 to 13`. - Updated CI-tested versions from `11, 12` to just `12`. - Ubuntu - Updated CI-tested versions from `20.04 LTS, 22.04 LTS` to just `22.04 LTS`. - Updated unsupported versions from `24.10 and earlier non-LTS` to `25 and earlier non-LTS`. - Chrome - Updated CI-tested version from `119 and 125` to just `145`. - Firefox - Updated CI-tested version from `143` to `148`. - Safari - Updated CI-tested version from `15.6` to `18.6`. - This one was less clear to me as it's tied to the macOS version, but it seems it's at least 18.6 since that's what came with later versions of macOS Sequoia. - Edge - Updated CI-tested version from `119 and 125` to `145`. - No changes to Android, iOS, or Windows. --- .../content/reference/supported-platforms.md | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/sites/docs/src/content/reference/supported-platforms.md b/sites/docs/src/content/reference/supported-platforms.md index 521851f39e..35837d2b87 100644 --- a/sites/docs/src/content/reference/supported-platforms.md +++ b/sites/docs/src/content/reference/supported-platforms.md @@ -22,65 +22,65 @@ Flutter supports deploying to the following platforms. ## Mobile platforms - - ## Desktop platforms - - - - @@ -94,7 +94,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript, WebAssembly" deploy-to="web" supported="[Latest 2](https://chromereleases.googleblog.com/search/label/Stable%20updates)" - ci-tested="119, 125" + ci-tested="145" unsupported="95 and earlier" deploy-to-link="/deployment/web" /> @@ -104,7 +104,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript" deploy-to="web" supported="[Latest 2](https://www.mozilla.org/en-US/firefox/releases/)" - ci-tested="143" + ci-tested="148" unsupported="98 and earlier" deploy-to-link="/deployment/web" /> @@ -114,7 +114,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript" deploy-to="web" supported="15.6 and newer" - ci-tested="15.6" + ci-tested="18.6" unsupported="15.5 and earlier" deploy-to-link="/deployment/web" /> @@ -124,7 +124,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript, WebAssembly" deploy-to="web" supported="[Latest 2](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel)" - ci-tested="119, 125" + ci-tested="145" unsupported="95 and earlier" deploy-to-link="/deployment/web" /> From d54fc6a6776315864c21febbccb9c9a74862f120 Mon Sep 17 00:00:00 2001 From: Victor Sanni Date: Tue, 19 May 2026 20:32:29 -0700 Subject: [PATCH 25/28] Add redirect for iOS 26 keyboard bleed document (#13411) Add `/go/ios-26-keyboard-bleed` design doc redirect. --- firebase.json | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase.json b/firebase.json index fa4bb33399..55ba258cf4 100644 --- a/firebase.json +++ b/firebase.json @@ -558,6 +558,7 @@ { "source": "/go/introduce-disposable", "destination": "https://docs.google.com/document/d/1cjylBOczGk70x-sn1iZYVNAfpPZdtGWsm_KzoNQX0jc/edit", "type": 301 }, { "source": "/go/io22concurrency", "destination": "https://github.com/goderbauer/io22concurrency", "type": 301 }, { "source": "/go/ios-17-text-input", "destination": "https://docs.google.com/document/d/1sM3HMv-SQin39yX1aPUU7vtGv7Hcef1Quc3QhRXBl6A/edit?resourcekey=0-SFYD8vmOIkXiXCZvB1Wlcw", "type": 301 }, + { "source": "/go/ios-26-keyboard-bleed", "destination": "https://docs.google.com/document/d/1WU1XhnVQYIgdab8dAqpVjLLviK02BeOmjDjektpYHRk/edit?usp=sharing", "type": 301 }, { "source": "/go/ios-autocorrection-highlight-support", "destination": "https://docs.google.com/document/d/18ZO7ThKu2wwCofGOKZSInPsq93IzkQTRn9eiyskeh7I/edit", "type": 301 }, { "source": "/go/ios-camera-plugin-thread-model", "destination": "https://docs.google.com/document/d/1Znjp-BduXIb1Ix3JOE1YKyJi1Z0d6rB-2q6Lt7j8xSo/edit", "type": 301 }, { "source": "/go/ios-keyboard-calculating-inset", "destination": "https://docs.google.com/document/d/1pb1oqTanWSxwM8nAdm_-_ero3P6MM05vR1JjcdeFkiM/edit?usp=sharing&resourcekey=0-syHrzFB8A4zywVaHBicZNg", "type": 301 }, From a58d36b3f9925bd1305e6e19536e8d9cf5f15b40 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Tue, 19 May 2026 22:49:47 -0500 Subject: [PATCH 26/28] Tighten miscellaneous dependency constraints (#13410) Also regenerate code where appropriate with the latest version of dependencies. --- examples/animation/animate0/pubspec.yaml | 2 +- examples/animation/animate1/pubspec.yaml | 2 +- examples/animation/animate2/pubspec.yaml | 2 +- examples/animation/animate3/pubspec.yaml | 2 +- examples/animation/animate4/pubspec.yaml | 2 +- examples/animation/animate5/pubspec.yaml | 2 +- .../offline_first/pubspec.yaml | 4 +- .../lib/business/model/todo.freezed.dart | 133 +++++++++++++++- .../todo_data_service/pubspec.yaml | 14 +- examples/cookbook/design/fonts/pubspec.yaml | 2 +- .../design/package_fonts/pubspec.yaml | 2 +- examples/cookbook/design/themes/pubspec.yaml | 2 +- .../effects/download_button/pubspec.yaml | 2 +- .../effects/drag_a_widget/pubspec.yaml | 2 +- .../effects/expandable_fab/pubspec.yaml | 2 +- .../cookbook/effects/nested_nav/pubspec.yaml | 2 +- .../effects/parallax_scrolling/pubspec.yaml | 2 +- .../effects/shimmer_loading/pubspec.yaml | 2 +- .../staggered_menu_animation/pubspec.yaml | 2 +- .../cookbook/forms/text_input/pubspec.yaml | 2 +- .../games/firestore_multiplayer/pubspec.yaml | 8 +- .../images/cached_images/pubspec.yaml | 2 +- .../images/fading_in_images/pubspec.yaml | 2 +- .../images/network_image/pubspec.yaml | 2 +- .../cookbook/lists/basic_list/pubspec.yaml | 2 +- .../cookbook/lists/grid_lists/pubspec.yaml | 2 +- .../lists/horizontal_list/pubspec.yaml | 2 +- .../maintenance/error_reporting/pubspec.yaml | 2 +- .../navigation/navigation_basics/pubspec.yaml | 2 +- .../authenticated_requests/pubspec.yaml | 2 +- .../background_parsing/pubspec.yaml | 2 +- .../networking/delete_data/pubspec.yaml | 2 +- .../networking/fetch_data/pubspec.yaml | 2 +- .../networking/send_data/pubspec.yaml | 2 +- .../networking/update_data/pubspec.yaml | 2 +- .../persistence/key_value/pubspec.yaml | 2 +- .../cookbook/persistence/sqlite/pubspec.yaml | 2 +- .../plugins/picture_using_camera/pubspec.yaml | 2 +- .../cookbook/plugins/play_video/pubspec.yaml | 2 +- .../integration/introduction/pubspec.yaml | 2 +- .../testing/unit/counter_app/pubspec.yaml | 4 +- .../testing/unit/mocking/pubspec.yaml | 6 +- .../mocking/test/fetch_album_test.mocks.dart | 1 + examples/data-and-backend/json/pubspec.yaml | 6 +- examples/deployment/obfuscate/pubspec.yaml | 2 +- examples/fwe/rolodex/pubspec.yaml | 2 +- .../flutter-for/android_devs/pubspec.yaml | 6 +- .../flutter-for/declarative/pubspec.yaml | 2 +- .../flutter-for/ios_devs/pubspec.yaml | 6 +- .../react_native_devs/pubspec.yaml | 6 +- .../flutter-for/web_devs/pubspec.yaml | 2 +- .../flutter-for/xamarin_devs/pubspec.yaml | 4 +- examples/googleapis/pubspec.yaml | 2 +- examples/integration_test/pubspec.yaml | 2 +- .../integration_test_migration/pubspec.yaml | 2 +- examples/layout/base/pubspec.yaml | 2 +- examples/layout/card_and_stack/pubspec.yaml | 2 +- examples/layout/container/pubspec.yaml | 2 +- examples/layout/gallery/pubspec.yaml | 2 +- examples/layout/grid_and_list/pubspec.yaml | 2 +- .../layout/lakes/interactive/pubspec.yaml | 2 +- examples/layout/lakes/step2/pubspec.yaml | 2 +- examples/layout/lakes/step3/pubspec.yaml | 2 +- examples/layout/lakes/step4/pubspec.yaml | 2 +- examples/layout/lakes/step5/pubspec.yaml | 2 +- examples/layout/lakes/step6/pubspec.yaml | 2 +- examples/layout/non_material/pubspec.yaml | 2 +- examples/layout/pavlova/pubspec.yaml | 2 +- examples/layout/row_column/pubspec.yaml | 2 +- examples/layout/sizing/pubspec.yaml | 2 +- .../perf/concurrency/isolates/pubspec.yaml | 2 +- .../perf/deferred_components/pubspec.yaml | 4 +- .../pigeon/lib/generated_pigeon.dart | 143 ++++++++++++------ .../platform_integration/pigeon/pubspec.yaml | 3 +- .../architectural_overview/pubspec.yaml | 2 +- examples/state_mgmt/simple/pubspec.yaml | 4 +- examples/testing/errors/pubspec.yaml | 2 +- .../testing/native_debugging/pubspec.yaml | 2 +- examples/tools/pubspec.yaml | 2 +- examples/ui/adaptive_app_demos/pubspec.yaml | 2 +- examples/ui/assets_and_images/pubspec.yaml | 6 +- examples/ui/navigation/pubspec.yaml | 2 +- packages/excerpter/pubspec.yaml | 14 +- sites/docs/pubspec.yaml | 8 +- 84 files changed, 347 insertions(+), 163 deletions(-) diff --git a/examples/animation/animate0/pubspec.yaml b/examples/animation/animate0/pubspec.yaml index 7d9cfea0d7..606c5f67bc 100644 --- a/examples/animation/animate0/pubspec.yaml +++ b/examples/animation/animate0/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate1/pubspec.yaml b/examples/animation/animate1/pubspec.yaml index c78a25b317..784949a177 100644 --- a/examples/animation/animate1/pubspec.yaml +++ b/examples/animation/animate1/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate2/pubspec.yaml b/examples/animation/animate2/pubspec.yaml index aed1bd0823..b306b52496 100644 --- a/examples/animation/animate2/pubspec.yaml +++ b/examples/animation/animate2/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate3/pubspec.yaml b/examples/animation/animate3/pubspec.yaml index 450cc9bbe2..9c40576590 100644 --- a/examples/animation/animate3/pubspec.yaml +++ b/examples/animation/animate3/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate4/pubspec.yaml b/examples/animation/animate4/pubspec.yaml index b7f752d81d..d2dc77d8a4 100644 --- a/examples/animation/animate4/pubspec.yaml +++ b/examples/animation/animate4/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate5/pubspec.yaml b/examples/animation/animate5/pubspec.yaml index ecaf770cc0..483d6f720c 100644 --- a/examples/animation/animate5/pubspec.yaml +++ b/examples/animation/animate5/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/app-architecture/offline_first/pubspec.yaml b/examples/app-architecture/offline_first/pubspec.yaml index 5be1c19f1a..5b93387f3b 100644 --- a/examples/app-architecture/offline_first/pubspec.yaml +++ b/examples/app-architecture/offline_first/pubspec.yaml @@ -13,8 +13,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - build_runner: ^2.6.0 - freezed: ^3.2.0 + build_runner: ^2.15.0 + freezed: ^3.2.5 flutter: uses-material-design: true diff --git a/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart b/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart index 840b4b2a2e..7151521ca5 100644 --- a/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart +++ b/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -76,6 +75,136 @@ as String, } +/// Adds pattern-matching-related methods to [Todo]. +extension TodoPatterns on Todo { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Todo value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Todo value) $default,){ +final _that = this; +switch (_that) { +case _Todo(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Todo value)? $default,){ +final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int id, String task)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that.id,_that.task);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int id, String task) $default,) {final _that = this; +switch (_that) { +case _Todo(): +return $default(_that.id,_that.task);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int id, String task)? $default,) {final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that.id,_that.task);case _: + return null; + +} +} + +} + /// @nodoc diff --git a/examples/app-architecture/todo_data_service/pubspec.yaml b/examples/app-architecture/todo_data_service/pubspec.yaml index b399211c30..86d5d239ca 100644 --- a/examples/app-architecture/todo_data_service/pubspec.yaml +++ b/examples/app-architecture/todo_data_service/pubspec.yaml @@ -9,18 +9,18 @@ dependencies: flutter: sdk: flutter freezed_annotation: ^3.1.0 - json_annotation: ^4.9.0 + json_annotation: ^4.12.0 path: ^1.9.1 - shared_preferences: ^2.5.3 - sqflite: ^2.4.2 - sqflite_common_ffi: ^2.3.6 + shared_preferences: ^2.5.5 + sqflite: ^2.4.2+1 + sqflite_common_ffi: ^2.4.0+3 dev_dependencies: flutter_test: sdk: flutter - build_runner: ^2.6.0 - freezed: ^3.2.0 - json_serializable: ^6.10.0 + build_runner: ^2.15.0 + freezed: ^3.2.5 + json_serializable: ^6.14.0 flutter: uses-material-design: true diff --git a/examples/cookbook/design/fonts/pubspec.yaml b/examples/cookbook/design/fonts/pubspec.yaml index e4bcf7c63b..6685d34613 100644 --- a/examples/cookbook/design/fonts/pubspec.yaml +++ b/examples/cookbook/design/fonts/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/design/package_fonts/pubspec.yaml b/examples/cookbook/design/package_fonts/pubspec.yaml index 79b70f8258..c3949e7ff5 100644 --- a/examples/cookbook/design/package_fonts/pubspec.yaml +++ b/examples/cookbook/design/package_fonts/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/design/themes/pubspec.yaml b/examples/cookbook/design/themes/pubspec.yaml index 6b7747dcd5..05b9397ddd 100644 --- a/examples/cookbook/design/themes/pubspec.yaml +++ b/examples/cookbook/design/themes/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - google_fonts: ^8.0.0 + google_fonts: ^8.1.0 flutter: uses-material-design: true diff --git a/examples/cookbook/effects/download_button/pubspec.yaml b/examples/cookbook/effects/download_button/pubspec.yaml index 416c8cfcab..6ac260ae42 100644 --- a/examples/cookbook/effects/download_button/pubspec.yaml +++ b/examples/cookbook/effects/download_button/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/drag_a_widget/pubspec.yaml b/examples/cookbook/effects/drag_a_widget/pubspec.yaml index 26a91cc030..139a72b759 100644 --- a/examples/cookbook/effects/drag_a_widget/pubspec.yaml +++ b/examples/cookbook/effects/drag_a_widget/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/expandable_fab/pubspec.yaml b/examples/cookbook/effects/expandable_fab/pubspec.yaml index 475ec92125..c107a25475 100644 --- a/examples/cookbook/effects/expandable_fab/pubspec.yaml +++ b/examples/cookbook/effects/expandable_fab/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/nested_nav/pubspec.yaml b/examples/cookbook/effects/nested_nav/pubspec.yaml index 7a3f5d7aa5..53d9054141 100644 --- a/examples/cookbook/effects/nested_nav/pubspec.yaml +++ b/examples/cookbook/effects/nested_nav/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/parallax_scrolling/pubspec.yaml b/examples/cookbook/effects/parallax_scrolling/pubspec.yaml index d064c4a136..cf8a6a9d65 100644 --- a/examples/cookbook/effects/parallax_scrolling/pubspec.yaml +++ b/examples/cookbook/effects/parallax_scrolling/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/shimmer_loading/pubspec.yaml b/examples/cookbook/effects/shimmer_loading/pubspec.yaml index ae7f9f12f8..673f281952 100644 --- a/examples/cookbook/effects/shimmer_loading/pubspec.yaml +++ b/examples/cookbook/effects/shimmer_loading/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml b/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml index d1970aac2a..5cfee6b71e 100644 --- a/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml +++ b/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/forms/text_input/pubspec.yaml b/examples/cookbook/forms/text_input/pubspec.yaml index 92f3dc28b9..eb79f031f7 100644 --- a/examples/cookbook/forms/text_input/pubspec.yaml +++ b/examples/cookbook/forms/text_input/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/games/firestore_multiplayer/pubspec.yaml b/examples/cookbook/games/firestore_multiplayer/pubspec.yaml index 82d69d3759..b3e8e0fb52 100644 --- a/examples/cookbook/games/firestore_multiplayer/pubspec.yaml +++ b/examples/cookbook/games/firestore_multiplayer/pubspec.yaml @@ -9,11 +9,11 @@ dependencies: flutter: sdk: flutter - async: ^2.13.0 - cloud_firestore: ^6.0.0 - firebase_core: ^4.0.0 + async: ^2.13.1 + cloud_firestore: ^6.4.1 + firebase_core: ^4.9.0 logging: ^1.3.0 - provider: ^6.1.5 + provider: ^6.1.5+1 flutter: uses-material-design: true diff --git a/examples/cookbook/images/cached_images/pubspec.yaml b/examples/cookbook/images/cached_images/pubspec.yaml index 6423b6a2ba..8f26a95ee8 100644 --- a/examples/cookbook/images/cached_images/pubspec.yaml +++ b/examples/cookbook/images/cached_images/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 cached_network_image: ^3.4.1 dev_dependencies: diff --git a/examples/cookbook/images/fading_in_images/pubspec.yaml b/examples/cookbook/images/fading_in_images/pubspec.yaml index 8c57d526ac..9c30c8c2e9 100644 --- a/examples/cookbook/images/fading_in_images/pubspec.yaml +++ b/examples/cookbook/images/fading_in_images/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 transparent_image: ^2.0.1 dev_dependencies: diff --git a/examples/cookbook/images/network_image/pubspec.yaml b/examples/cookbook/images/network_image/pubspec.yaml index cfbe13d582..13346df44b 100644 --- a/examples/cookbook/images/network_image/pubspec.yaml +++ b/examples/cookbook/images/network_image/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/lists/basic_list/pubspec.yaml b/examples/cookbook/lists/basic_list/pubspec.yaml index 5f6461b8a7..9e9666adcc 100644 --- a/examples/cookbook/lists/basic_list/pubspec.yaml +++ b/examples/cookbook/lists/basic_list/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/lists/grid_lists/pubspec.yaml b/examples/cookbook/lists/grid_lists/pubspec.yaml index 372fbd1466..dc47eb46b0 100644 --- a/examples/cookbook/lists/grid_lists/pubspec.yaml +++ b/examples/cookbook/lists/grid_lists/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/lists/horizontal_list/pubspec.yaml b/examples/cookbook/lists/horizontal_list/pubspec.yaml index d23114b631..e9518893cd 100644 --- a/examples/cookbook/lists/horizontal_list/pubspec.yaml +++ b/examples/cookbook/lists/horizontal_list/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/maintenance/error_reporting/pubspec.yaml b/examples/cookbook/maintenance/error_reporting/pubspec.yaml index b89db58467..bc1e80665b 100644 --- a/examples/cookbook/maintenance/error_reporting/pubspec.yaml +++ b/examples/cookbook/maintenance/error_reporting/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: flutter: sdk: flutter - sentry_flutter: ^9.6.0 + sentry_flutter: ^9.20.0 dev_dependencies: flutter_test: diff --git a/examples/cookbook/navigation/navigation_basics/pubspec.yaml b/examples/cookbook/navigation/navigation_basics/pubspec.yaml index e3428bb59b..3e61b15e6f 100644 --- a/examples/cookbook/navigation/navigation_basics/pubspec.yaml +++ b/examples/cookbook/navigation/navigation_basics/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/networking/authenticated_requests/pubspec.yaml b/examples/cookbook/networking/authenticated_requests/pubspec.yaml index dd2bb81003..ce188788cb 100644 --- a/examples/cookbook/networking/authenticated_requests/pubspec.yaml +++ b/examples/cookbook/networking/authenticated_requests/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/background_parsing/pubspec.yaml b/examples/cookbook/networking/background_parsing/pubspec.yaml index 4894893d7f..a85058b286 100644 --- a/examples/cookbook/networking/background_parsing/pubspec.yaml +++ b/examples/cookbook/networking/background_parsing/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/delete_data/pubspec.yaml b/examples/cookbook/networking/delete_data/pubspec.yaml index 210e738ee4..3620c6fb75 100644 --- a/examples/cookbook/networking/delete_data/pubspec.yaml +++ b/examples/cookbook/networking/delete_data/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/fetch_data/pubspec.yaml b/examples/cookbook/networking/fetch_data/pubspec.yaml index 70d3e803be..3f0dab6f68 100644 --- a/examples/cookbook/networking/fetch_data/pubspec.yaml +++ b/examples/cookbook/networking/fetch_data/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/send_data/pubspec.yaml b/examples/cookbook/networking/send_data/pubspec.yaml index ce34ba4aa4..e53eae437a 100644 --- a/examples/cookbook/networking/send_data/pubspec.yaml +++ b/examples/cookbook/networking/send_data/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/update_data/pubspec.yaml b/examples/cookbook/networking/update_data/pubspec.yaml index a5c81800de..121ca36058 100644 --- a/examples/cookbook/networking/update_data/pubspec.yaml +++ b/examples/cookbook/networking/update_data/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/persistence/key_value/pubspec.yaml b/examples/cookbook/persistence/key_value/pubspec.yaml index 5f5e6f754a..1b00dd5191 100644 --- a/examples/cookbook/persistence/key_value/pubspec.yaml +++ b/examples/cookbook/persistence/key_value/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - shared_preferences: ^2.5.3 + shared_preferences: ^2.5.5 flutter_test: sdk: flutter diff --git a/examples/cookbook/persistence/sqlite/pubspec.yaml b/examples/cookbook/persistence/sqlite/pubspec.yaml index 6b6240f741..e7398cea5c 100644 --- a/examples/cookbook/persistence/sqlite/pubspec.yaml +++ b/examples/cookbook/persistence/sqlite/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - sqflite: ^2.4.2 + sqflite: ^2.4.2+1 path: ^1.9.1 dev_dependencies: diff --git a/examples/cookbook/plugins/picture_using_camera/pubspec.yaml b/examples/cookbook/plugins/picture_using_camera/pubspec.yaml index 28fcebf2ef..e519adfcde 100644 --- a/examples/cookbook/plugins/picture_using_camera/pubspec.yaml +++ b/examples/cookbook/plugins/picture_using_camera/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - camera: ^0.12.0 + camera: ^0.12.0+1 path_provider: ^2.1.5 path: ^1.9.1 diff --git a/examples/cookbook/plugins/play_video/pubspec.yaml b/examples/cookbook/plugins/play_video/pubspec.yaml index 99955fa499..ade76e8df4 100644 --- a/examples/cookbook/plugins/play_video/pubspec.yaml +++ b/examples/cookbook/plugins/play_video/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - video_player: ^2.10.0 + video_player: ^2.11.1 dev_dependencies: flutter_test: diff --git a/examples/cookbook/testing/integration/introduction/pubspec.yaml b/examples/cookbook/testing/integration/introduction/pubspec.yaml index f19bbc05da..c9e9e5552e 100644 --- a/examples/cookbook/testing/integration/introduction/pubspec.yaml +++ b/examples/cookbook/testing/integration/introduction/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: sdk: flutter dev_dependencies: - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/cookbook/testing/unit/counter_app/pubspec.yaml b/examples/cookbook/testing/unit/counter_app/pubspec.yaml index a2ca8a4e70..edd3ec855a 100644 --- a/examples/cookbook/testing/unit/counter_app/pubspec.yaml +++ b/examples/cookbook/testing/unit/counter_app/pubspec.yaml @@ -11,8 +11,8 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - test: ^1.26.2 + cupertino_icons: ^1.0.9 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/cookbook/testing/unit/mocking/pubspec.yaml b/examples/cookbook/testing/unit/mocking/pubspec.yaml index add5eec47d..6081bdac1c 100644 --- a/examples/cookbook/testing/unit/mocking/pubspec.yaml +++ b/examples/cookbook/testing/unit/mocking/pubspec.yaml @@ -10,13 +10,13 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 dev_dependencies: flutter_test: sdk: flutter - mockito: ^5.5.0 - build_runner: ^2.6.0 + mockito: ^5.6.4 + build_runner: ^2.15.0 flutter: uses-material-design: true diff --git a/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart b/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart index 30be28abbb..2e3518715f 100644 --- a/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart +++ b/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart @@ -24,6 +24,7 @@ import 'package:mockito/src/dummies.dart' as _i5; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member class _FakeResponse_0 extends _i1.SmartFake implements _i2.Response { _FakeResponse_0(Object parent, Invocation parentInvocation) diff --git a/examples/data-and-backend/json/pubspec.yaml b/examples/data-and-backend/json/pubspec.yaml index 33fd38410b..1b150d7704 100644 --- a/examples/data-and-backend/json/pubspec.yaml +++ b/examples/data-and-backend/json/pubspec.yaml @@ -9,8 +9,8 @@ environment: sdk: ^3.12.0-0 dependencies: - json_annotation: ^4.9.0 + json_annotation: ^4.12.0 dev_dependencies: - build_runner: ^2.6.0 - json_serializable: ^6.10.0 + build_runner: ^2.15.0 + json_serializable: ^6.14.0 diff --git a/examples/deployment/obfuscate/pubspec.yaml b/examples/deployment/obfuscate/pubspec.yaml index dd2624c1bc..24365047ac 100644 --- a/examples/deployment/obfuscate/pubspec.yaml +++ b/examples/deployment/obfuscate/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 flutter_test: sdk: flutter diff --git a/examples/fwe/rolodex/pubspec.yaml b/examples/fwe/rolodex/pubspec.yaml index 016bf47e1e..da4ea72c6d 100644 --- a/examples/fwe/rolodex/pubspec.yaml +++ b/examples/fwe/rolodex/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/get-started/flutter-for/android_devs/pubspec.yaml b/examples/get-started/flutter-for/android_devs/pubspec.yaml index 5231c574c7..e423f51600 100644 --- a/examples/get-started/flutter-for/android_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/android_devs/pubspec.yaml @@ -15,9 +15,9 @@ dependencies: flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 - shared_preferences: ^2.5.3 + cupertino_icons: ^1.0.9 + http: ^1.6.0 + shared_preferences: ^2.5.5 intl: any dev_dependencies: diff --git a/examples/get-started/flutter-for/declarative/pubspec.yaml b/examples/get-started/flutter-for/declarative/pubspec.yaml index 2a877d5296..5c58c1079b 100644 --- a/examples/get-started/flutter-for/declarative/pubspec.yaml +++ b/examples/get-started/flutter-for/declarative/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/get-started/flutter-for/ios_devs/pubspec.yaml b/examples/get-started/flutter-for/ios_devs/pubspec.yaml index 2ee9cfde83..134e71d64e 100644 --- a/examples/get-started/flutter-for/ios_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/ios_devs/pubspec.yaml @@ -13,9 +13,9 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 - shared_preferences: ^2.5.3 + cupertino_icons: ^1.0.9 + http: ^1.6.0 + shared_preferences: ^2.5.5 url_launcher: ^6.3.2 dev_dependencies: diff --git a/examples/get-started/flutter-for/react_native_devs/pubspec.yaml b/examples/get-started/flutter-for/react_native_devs/pubspec.yaml index 50646cd015..5acae0562e 100644 --- a/examples/get-started/flutter-for/react_native_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/react_native_devs/pubspec.yaml @@ -14,9 +14,9 @@ workspace: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 - shared_preferences: ^2.5.3 + cupertino_icons: ^1.0.9 + http: ^1.6.0 + shared_preferences: ^2.5.5 my_widgets: path: my_widgets diff --git a/examples/get-started/flutter-for/web_devs/pubspec.yaml b/examples/get-started/flutter-for/web_devs/pubspec.yaml index 8984161410..87e5ece55a 100644 --- a/examples/get-started/flutter-for/web_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/web_devs/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml b/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml index a24b53af4d..0b2cb0d6d4 100644 --- a/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml @@ -13,8 +13,8 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 + cupertino_icons: ^1.0.9 + http: ^1.6.0 dev_dependencies: flutter_test: diff --git a/examples/googleapis/pubspec.yaml b/examples/googleapis/pubspec.yaml index 25e5f3bfc9..005e78bce4 100644 --- a/examples/googleapis/pubspec.yaml +++ b/examples/googleapis/pubspec.yaml @@ -12,4 +12,4 @@ dependencies: sdk: flutter google_sign_in: ^7.2.0 googleapis: ^16.0.0 - http: ^1.5.0 + http: ^1.6.0 diff --git a/examples/integration_test/pubspec.yaml b/examples/integration_test/pubspec.yaml index bd96d3e836..055fa53b41 100644 --- a/examples/integration_test/pubspec.yaml +++ b/examples/integration_test/pubspec.yaml @@ -17,7 +17,7 @@ dev_dependencies: sdk: flutter flutter_driver: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/integration_test_migration/pubspec.yaml b/examples/integration_test_migration/pubspec.yaml index 33ceb0759c..4d02e377bd 100644 --- a/examples/integration_test_migration/pubspec.yaml +++ b/examples/integration_test_migration/pubspec.yaml @@ -19,7 +19,7 @@ dev_dependencies: sdk: flutter flutter_driver: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/layout/base/pubspec.yaml b/examples/layout/base/pubspec.yaml index d39f9b1e90..029f159825 100644 --- a/examples/layout/base/pubspec.yaml +++ b/examples/layout/base/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/card_and_stack/pubspec.yaml b/examples/layout/card_and_stack/pubspec.yaml index a3349e3d50..d775e9e3c1 100644 --- a/examples/layout/card_and_stack/pubspec.yaml +++ b/examples/layout/card_and_stack/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/container/pubspec.yaml b/examples/layout/container/pubspec.yaml index 6440de723f..97f63169ae 100644 --- a/examples/layout/container/pubspec.yaml +++ b/examples/layout/container/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/gallery/pubspec.yaml b/examples/layout/gallery/pubspec.yaml index 8ef432185e..7d1545c9d9 100644 --- a/examples/layout/gallery/pubspec.yaml +++ b/examples/layout/gallery/pubspec.yaml @@ -9,7 +9,7 @@ environment: sdk: ^3.12.0-0 dependencies: - animations: ^2.0.11 + animations: ^2.2.0 flutter: sdk: flutter diff --git a/examples/layout/grid_and_list/pubspec.yaml b/examples/layout/grid_and_list/pubspec.yaml index 188cb3a779..8ba47bae7a 100644 --- a/examples/layout/grid_and_list/pubspec.yaml +++ b/examples/layout/grid_and_list/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/interactive/pubspec.yaml b/examples/layout/lakes/interactive/pubspec.yaml index 4e64643af2..db3f3eb818 100644 --- a/examples/layout/lakes/interactive/pubspec.yaml +++ b/examples/layout/lakes/interactive/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step2/pubspec.yaml b/examples/layout/lakes/step2/pubspec.yaml index 9be1dba502..f083a0e7b5 100644 --- a/examples/layout/lakes/step2/pubspec.yaml +++ b/examples/layout/lakes/step2/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step3/pubspec.yaml b/examples/layout/lakes/step3/pubspec.yaml index 0667a946fd..acbb36e3e3 100644 --- a/examples/layout/lakes/step3/pubspec.yaml +++ b/examples/layout/lakes/step3/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step4/pubspec.yaml b/examples/layout/lakes/step4/pubspec.yaml index fa5a954216..48b7a0aad5 100644 --- a/examples/layout/lakes/step4/pubspec.yaml +++ b/examples/layout/lakes/step4/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step5/pubspec.yaml b/examples/layout/lakes/step5/pubspec.yaml index 9e03d0d8b3..7bcc3b504a 100644 --- a/examples/layout/lakes/step5/pubspec.yaml +++ b/examples/layout/lakes/step5/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step6/pubspec.yaml b/examples/layout/lakes/step6/pubspec.yaml index 82c98a1c1e..1327769a4d 100644 --- a/examples/layout/lakes/step6/pubspec.yaml +++ b/examples/layout/lakes/step6/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/non_material/pubspec.yaml b/examples/layout/non_material/pubspec.yaml index 3fa2a4b221..406ef25a34 100644 --- a/examples/layout/non_material/pubspec.yaml +++ b/examples/layout/non_material/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/pavlova/pubspec.yaml b/examples/layout/pavlova/pubspec.yaml index 291c2879ac..9a0cbcaca8 100644 --- a/examples/layout/pavlova/pubspec.yaml +++ b/examples/layout/pavlova/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/row_column/pubspec.yaml b/examples/layout/row_column/pubspec.yaml index 1c0023aaf5..771b19f8af 100644 --- a/examples/layout/row_column/pubspec.yaml +++ b/examples/layout/row_column/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/sizing/pubspec.yaml b/examples/layout/sizing/pubspec.yaml index 5e3645dc37..b8ca0cff6b 100644 --- a/examples/layout/sizing/pubspec.yaml +++ b/examples/layout/sizing/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/perf/concurrency/isolates/pubspec.yaml b/examples/perf/concurrency/isolates/pubspec.yaml index eb187c172a..2df2ee6698 100644 --- a/examples/perf/concurrency/isolates/pubspec.yaml +++ b/examples/perf/concurrency/isolates/pubspec.yaml @@ -11,4 +11,4 @@ environment: dependencies: flutter: sdk: flutter - shared_preferences: ^2.5.3 + shared_preferences: ^2.5.5 diff --git a/examples/perf/deferred_components/pubspec.yaml b/examples/perf/deferred_components/pubspec.yaml index 03887415ab..c22b64e569 100644 --- a/examples/perf/deferred_components/pubspec.yaml +++ b/examples/perf/deferred_components/pubspec.yaml @@ -10,12 +10,12 @@ dependencies: flutter: sdk: flutter - provider: ^6.1.5 + provider: ^6.1.5+1 dev_dependencies: flutter_test: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/platform_integration/pigeon/lib/generated_pigeon.dart b/examples/platform_integration/pigeon/lib/generated_pigeon.dart index ee150cc112..8ab7de5d03 100644 --- a/examples/platform_integration/pigeon/lib/generated_pigeon.dart +++ b/examples/platform_integration/pigeon/lib/generated_pigeon.dart @@ -1,21 +1,49 @@ -// Autogenerated from Pigeon (v26.0.0), do not edit directly. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers, avoid_types_on_closure_parameters +// ignore_for_file: unused_import, unused_shown_name +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, omit_local_variable_types, omit_obvious_local_variable_types import 'dart:async'; -import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; +import 'dart:typed_data' show Float64List, Int32List, Int64List; -import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; - -PlatformException _createConnectionError(String channelName) { - return PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel: "$channelName".', - ); +import 'package:meta/meta.dart' show immutable, protected, visibleForTesting; + +Object? _extractReplyValueOrThrow( + List? replyList, + String channelName, { + required bool isNullValid, +}) { + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel: "$channelName".', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else if (!isNullValid && (replyList.isNotEmpty && replyList[0] == null)) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } + return replyList.firstOrNull; } bool _deepEquals(Object? a, Object? b) { + if (identical(a, b)) { + return true; + } + if (a is double && b is double) { + if (a.isNaN && b.isNaN) { + return true; + } + return a == b; + } if (a is List && b is List) { return a.length == b.length && a.indexed.every( @@ -23,16 +51,52 @@ bool _deepEquals(Object? a, Object? b) { ); } if (a is Map && b is Map) { - return a.length == b.length && - a.entries.every( - (MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key]), - ); + if (a.length != b.length) { + return false; + } + for (final MapEntry entryA in a.entries) { + bool found = false; + for (final MapEntry entryB in b.entries) { + if (_deepEquals(entryA.key, entryB.key)) { + if (_deepEquals(entryA.value, entryB.value)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; } return a == b; } +int _deepHash(Object? value) { + if (value is List) { + return Object.hashAll(value.map(_deepHash)); + } + if (value is Map) { + int result = 0; + for (final MapEntry entry in value.entries) { + result += (_deepHash(entry.key) * 31) ^ _deepHash(entry.value); + } + return result; + } + if (value is double && value.isNaN) { + // Normalize NaN to a consistent hash. + return 0x7FF8000000000000.hashCode; + } + if (value is double && value == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + return 0.0.hashCode; + } + return value.hashCode; +} + class SearchRequest { SearchRequest({required this.query}); @@ -60,12 +124,12 @@ class SearchRequest { if (identical(this, other)) { return true; } - return _deepEquals(encode(), other.encode()); + return _deepEquals(query, other.query); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => _deepHash([runtimeType, ..._toList()]); } class SearchReply { @@ -95,12 +159,12 @@ class SearchReply { if (identical(this, other)) { return true; } - return _deepEquals(encode(), other.encode()); + return _deepEquals(result, other.result); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => _deepHash([runtimeType, ..._toList()]); } class _PigeonCodec extends StandardMessageCodec { @@ -150,34 +214,23 @@ class Api { final String pigeonVar_messageChannelSuffix; Future search(SearchRequest request) async { - final String pigeonVar_channelName = + final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_examples.Api.search$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send( [request], ); - final List? pigeonVar_replyList = - await pigeonVar_sendFuture as List?; - if (pigeonVar_replyList == null) { - throw _createConnectionError(pigeonVar_channelName); - } else if (pigeonVar_replyList.length > 1) { - throw PlatformException( - code: pigeonVar_replyList[0]! as String, - message: pigeonVar_replyList[1] as String?, - details: pigeonVar_replyList[2], - ); - } else if (pigeonVar_replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); - } else { - return (pigeonVar_replyList[0] as SearchReply?)!; - } + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + + final Object? pigeonVar_replyValue = _extractReplyValueOrThrow( + pigeonVar_replyList, + pigeonVar_channelName, + isNullValid: false, + ); + return pigeonVar_replyValue! as SearchReply; } } diff --git a/examples/platform_integration/pigeon/pubspec.yaml b/examples/platform_integration/pigeon/pubspec.yaml index 30d2215a9a..9748359c6e 100644 --- a/examples/platform_integration/pigeon/pubspec.yaml +++ b/examples/platform_integration/pigeon/pubspec.yaml @@ -12,7 +12,8 @@ environment: dependencies: flutter: sdk: flutter - pigeon: ^26.0.0 + meta: any + pigeon: ^26.3.4 dev_dependencies: flutter_test: diff --git a/examples/resources/architectural_overview/pubspec.yaml b/examples/resources/architectural_overview/pubspec.yaml index 9b91f570aa..175dcc6456 100644 --- a/examples/resources/architectural_overview/pubspec.yaml +++ b/examples/resources/architectural_overview/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: flutter: sdk: flutter - ffi: ^2.1.4 + ffi: ^2.2.0 flutter: uses-material-design: true diff --git a/examples/state_mgmt/simple/pubspec.yaml b/examples/state_mgmt/simple/pubspec.yaml index de65b89166..46cace50fd 100644 --- a/examples/state_mgmt/simple/pubspec.yaml +++ b/examples/state_mgmt/simple/pubspec.yaml @@ -10,12 +10,12 @@ dependencies: flutter: sdk: flutter - provider: ^6.1.5 + provider: ^6.1.5+1 dev_dependencies: flutter_test: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/testing/errors/pubspec.yaml b/examples/testing/errors/pubspec.yaml index 619ddeaaae..750a006ed4 100644 --- a/examples/testing/errors/pubspec.yaml +++ b/examples/testing/errors/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: flutter: sdk: flutter - firebase_core: ^4.0.0 + firebase_core: ^4.9.0 dev_dependencies: integration_test: diff --git a/examples/testing/native_debugging/pubspec.yaml b/examples/testing/native_debugging/pubspec.yaml index 5343869dfe..951420e0ab 100644 --- a/examples/testing/native_debugging/pubspec.yaml +++ b/examples/testing/native_debugging/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 url_launcher: ^6.3.2 dev_dependencies: diff --git a/examples/tools/pubspec.yaml b/examples/tools/pubspec.yaml index e847e0e8c3..f4b3a888e5 100644 --- a/examples/tools/pubspec.yaml +++ b/examples/tools/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/ui/adaptive_app_demos/pubspec.yaml b/examples/ui/adaptive_app_demos/pubspec.yaml index fa03b2e129..7f83e300ef 100644 --- a/examples/ui/adaptive_app_demos/pubspec.yaml +++ b/examples/ui/adaptive_app_demos/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: bitsdojo_window: ^0.1.6 flextras: ^1.0.0 - provider: ^6.1.5 + provider: ^6.1.5+1 universal_platform: ^1.1.0 platform: ^3.1.6 diff --git a/examples/ui/assets_and_images/pubspec.yaml b/examples/ui/assets_and_images/pubspec.yaml index b41396a6e1..56e6643f7f 100644 --- a/examples/ui/assets_and_images/pubspec.yaml +++ b/examples/ui/assets_and_images/pubspec.yaml @@ -9,13 +9,13 @@ environment: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - vector_graphics: ^1.1.19 + cupertino_icons: ^1.0.9 + vector_graphics: ^1.2.2 dev_dependencies: flutter_test: sdk: flutter - vector_graphics_compiler: ^1.1.17 + vector_graphics_compiler: ^1.2.3 flutter: uses-material-design: true diff --git a/examples/ui/navigation/pubspec.yaml b/examples/ui/navigation/pubspec.yaml index 6c33618229..8c47570a83 100644 --- a/examples/ui/navigation/pubspec.yaml +++ b/examples/ui/navigation/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter - go_router: ^17.0.1 + go_router: ^17.2.3 flutter: uses-material-design: true diff --git a/packages/excerpter/pubspec.yaml b/packages/excerpter/pubspec.yaml index c4b58ccd69..9a1118e383 100644 --- a/packages/excerpter/pubspec.yaml +++ b/packages/excerpter/pubspec.yaml @@ -8,18 +8,18 @@ environment: sdk: ^3.12.0-0 dependencies: - args: ^2.6.0 - collection: ^1.19.0 - file: ^7.0.0 - glob: ^2.1.2 - meta: ^1.16.0 - path: ^1.9.0 + args: ^2.7.0 + collection: ^1.19.1 + file: ^7.0.1 + glob: ^2.1.3 + meta: ^1.18.2 + path: ^1.9.1 dev_dependencies: analysis_defaults: path: ../analysis_defaults io: ^1.0.5 - test: ^1.28.0 + test: ^1.31.1 executables: excerpter: excerpter diff --git a/sites/docs/pubspec.yaml b/sites/docs/pubspec.yaml index 082ea54709..133f430a6d 100644 --- a/sites/docs/pubspec.yaml +++ b/sites/docs/pubspec.yaml @@ -16,9 +16,9 @@ dependencies: jaspr_content: ^0.5.2 # Used as our template engine. liquify: ^1.5.1 - markdown: ^7.3.0 + markdown: ^7.3.1 markdown_description_list: ^0.1.1 - meta: ^1.18.1 + meta: ^1.18.2 nanoid2: ^2.0.1 # Used for syntax highlighting. opal: ^0.2.2 @@ -31,10 +31,10 @@ dev_dependencies: analysis_defaults: path: ../../packages/analysis_defaults build_runner: ^2.15.0 - build_web_compilers: ^4.4.19 + build_web_compilers: ^4.6.0 jaspr_builder: ^0.23.1 sass: ^1.99.0 - sass_builder: ^2.4.0 + sass_builder: ^2.4.0+1 jaspr: mode: static From bafb1cbf639f8a0bd42b69a821d8f11da491eb0e Mon Sep 17 00:00:00 2001 From: Amos Date: Wed, 20 May 2026 14:33:41 +0800 Subject: [PATCH 27/28] sync: 2026/05/20 --- sites/docs/src/data/sidenav/default.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sites/docs/src/data/sidenav/default.yml b/sites/docs/src/data/sidenav/default.yml index bf8640359b..e88cb9663a 100644 --- a/sites/docs/src/data/sidenav/default.yml +++ b/sites/docs/src/data/sidenav/default.yml @@ -419,14 +419,14 @@ permalink: /platform-integration/ios/ios-debugging - title: 在 iOS 上恢复状态 permalink: /platform-integration/ios/restore-state-ios - - title: Linux 操作系统平台 + - title: Linux 平台 permalink: /platform-integration/linux children: - title: 配置 Linux 开发 permalink: /platform-integration/linux/setup - title: 构建 Linux 桌面软件 permalink: /platform-integration/linux/building - - title: macOS 操作系统平台 + - title: macOS 平台 permalink: /platform-integration/macos children: - title: 配置 macOS 开发 @@ -460,7 +460,7 @@ permalink: /platform-integration/web/web-images - title: Web 平台常见问题 permalink: /platform-integration/web/faq - - title: Windows 操作系统平台 + - title: Windows 平台 permalink: /platform-integration/windows children: - title: 配置 Windows 开发 From 2c0afffacb18db813d9125d09964b1b505c990d5 Mon Sep 17 00:00:00 2001 From: Amos Date: Wed, 20 May 2026 15:10:01 +0800 Subject: [PATCH 28/28] sync: 2026/05/20 --- .../docs/src/content/cookbook/animation/page-route-animation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sites/docs/src/content/cookbook/animation/page-route-animation.md b/sites/docs/src/content/cookbook/animation/page-route-animation.md index 1e442a8b87..04242d83dd 100644 --- a/sites/docs/src/content/cookbook/animation/page-route-animation.md +++ b/sites/docs/src/content/cookbook/animation/page-route-animation.md @@ -145,7 +145,7 @@ full height of the page. 为了使新页面从底部动画出来,它应该从 `Offset(0,1)` 到 `Offset(0, 0)` 进行动画。 (通常我们会使用 `Offset.zero` 构造器。)在这个情况下, -对于 ['FractionalTranslation'][] widget 来说偏移量是一个 2D 矢量值。 +对于 [`FractionalTranslation`][] widget 来说偏移量是一个 2D 矢量值。 将 `dy` 参数设为 1,这代表在竖直方向上切换整个页面的高度。 The `transitionsBuilder` callback has an `animation` parameter. It's an