Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: flutter/packages
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: a8549ae8080b
Choose a base ref
...
head repository: flutter/packages
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 13d38e0d97a8
Choose a head ref
  • 9 commits
  • 28 files changed
  • 8 contributors

Commits on Oct 27, 2026

  1. [material_ui] Refactor typography.dart and text_theme.dart in pre…

    …paration for M3E (#13371)
    
    This PR is a no-op refactor of `typography.dart` and `text_theme.dart` to prepare for the Material 3 Expressive text styles. These changes were split out from my larger M3E typography changes to prevent that PR from being too big. 
    
    Specifically, this PR:
    - uses dartdoc templates in the `TextTheme` documentation to reduce documentation duplication
    - uses a helper method inside `apply` to reduce code duplication (helpful since we will be adding 15 new text styles with M3E)
    - adds a similar helper method inside `merge` to reduce code duplication
    - adds a `_withM3Colors` factory constructor to `Typography`. Currently this is only used once for M3, but it will also be used for M3E. 
    
    The tests in this PR are purely to increase coverage since these changes are all no-ops. They are not regression tests.
    
    Fixes flutter/flutter#195011
    
    ## Pre-Review Checklist
    
    **Version and changelog exemption:** Purely a refactor, no user-noticeable changes.
    
    **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.
    
    [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
    elliette authored Oct 27, 2026
    Configuration menu
    Copy the full SHA
    727c73e View commit details
    Browse the repository at this point in the history
  2. [in_app_purchase_storekit} Fix more test flakes (#13279)

    Fixes flutter/flutter#194285 (hopefully)
    
    The main cause of flutter/flutter#194285 (where `Product.products(for:)` returned `[]` across StoreKit 2 tests on the iOS 27 simulator) was fixed in #13213 by preventing the example app from calling StoreKit APIs before `SKTestSession` initialized. However, `testGetProductsWithStoreKitError` and `testFailedNetworkErrorPurchase` remains fragile in iOS 26.2+
    
    This is still because product caching in `StoreKitTest` is still 1. Opaque 2. unable to be manually cleared - the product cache sticks around even after calling `resetToDefaultState()`. Thus, the state of the cache depends on the order that the tests will run. :/ So, if a test that purchases a product succeeds, if we later hit `setSimulatedError(..., forAPI: .loadProducts)`, the cached product will be returned, causing the test to fail. 
    
    This is an issue that RevenueCat also ran into as shown here: RevenueCat/purchases-ios#6088, where they skip tests using `.loadProduct` for anything above ios 26. Instead of keeping dead tests around, I think its fair to just remove them and avoid just keeping dead code around till the end of time. Additionally, the code paths tested by the removed tests are already being hit by `testFailedProductUnavilablePurchase`, so we arent really losing coverage. 
    
    Additionally in this PR I fix up some leaky states between tests.
    
    ## Pre-Review Checklist
    LouiseHsu authored Oct 27, 2026
    Configuration menu
    Copy the full SHA
    559aeed View commit details
    Browse the repository at this point in the history
  3. [camera] Add support for zero-shutter-lag capture (#12374)

    Combines the interface and both implementations in one PR per the [federated plugin process](https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins); splits into an interface-first PR once the direction is approved. The API shape is a proposal for flutter/flutter#190598 — happy to reshape it however you prefer.
    
    Adds explicit **zero-shutter-lag** control: an opt-in on Android, where the default capture mode leaves it off, and an opt-out on iOS, where the OS enables it automatically when the session supports it.
    
    ## What's added
    
    `camera_platform_interface` — two methods on `CameraPlatform`, modeled on the existing `setJpegImageQuality` / `getSupportedVideoStabilizationModes` patterns. Defaults are `false` / no-op, so nothing changes for platforms or apps that don't opt in:
    
    ```dart
    Future<bool> isZeroShutterLagSupported(int cameraId);
    Future<void> setZeroShutterLagEnabled(int cameraId, bool enabled);
    ```
    
    `camera_android_camerax` — [`CameraInfo.isZslSupported()`](https://developer.android.com/reference/androidx/camera/core/CameraInfo#isZslSupported()) and [`ImageCapture.Builder.setCaptureMode(CAPTURE_MODE_ZERO_SHUTTER_LAG)`](https://developer.android.com/reference/androidx/camera/core/ImageCapture.Builder#setCaptureMode(int)). The capture mode is construction-only, so the use case is recreated — the approach `setJpegImageQuality` already uses for the same constraint, now sharing one helper so the two settings can't drop each other.
    
    `camera_avfoundation` — [`isZeroShutterLagSupported`](https://developer.apple.com/documentation/avfoundation/avcapturephotooutput/iszeroshutterlagsupported) / [`isZeroShutterLagEnabled`](https://developer.apple.com/documentation/avfoundation/avcapturephotooutput/iszeroshutterlagenabled) (iOS 17+). Enabling is guarded on the support query (setting it while unsupported throws `NSInvalidArgumentException`) and wrapped in `beginConfiguration`/`commitConfiguration`. The requested state is reapplied after camera switches, which silently reset it. Apps that never call the setter are left untouched, so iOS keeps its automatic behavior on upgrade.
    
    ## Notes for reviewers
    
    - **Platform defaults differ**: Android leaves ZSL off by default, iOS 17+ turns it on automatically when supported — so the same call is an opt-in on Android and an opt-out on iOS. Measurements below.
    - **Experimental API**: `CAPTURE_MODE_ZERO_SHUTTER_LAG` is `@ExperimentalZeroShutterLag`, handled with per-declaration `@OptIn` like this plugin's existing `ExperimentalCamera2Interop` / `ExperimentalLensFacing` / `ExperimentalPersistentRecording`. `gradlew lint` is clean.
    - **Unsupported cases need no app handling**: CameraX falls back on its own; iOS is guarded by the support query.
    - **Generated files**: regenerating with pigeon 26.1.5 also reverts two pre-existing hand-edits from #11616 (a redundant `Int32` cast and a missing doc comment).
    - **CI**: the publish check is red by design — the last commit holds the `make-deps-path-based` overrides and is reverted before landing.
    
    <details><summary>On-device measurements</summary>
    
    **Android** — Galaxy S21 (SM-G991N), 5 captures per mode, shutter fired via `adb shell input tap`. A running millisecond stopwatch was photographed; the time visible in each saved photo shows how far behind the shutter tap the captured frame is.
    
    | | Captured frame | Shutter → file saved |
    |---|---|---|
    | `MINIMIZE_LATENCY` (current) | baseline | 912 ms |
    | `ZERO_SHUTTER_LAG` | **629 ms earlier** | 639 ms |
    
    **iOS** — iPhone (iOS 26.5), `ResolutionPreset.max`, 5 captures per mode after discarding one warm-up capture. Compares `AVCapturePhoto.timestamp` against the host-clock time of the `capturePhoto` call, so a negative value means the saved frame predates the call.
    
    | | Frame vs. shutter call | Shutter → delegate |
    |---|---|---|
    | ZSL off | +279 ms | 941 ms |
    | ZSL on | **−74 ms** | 689 ms |
    
    With ZSL on, every captured frame predated the capture call. Support is session-dependent rather than device-wide: the same device reports supported at `ResolutionPreset.max` and unsupported at `medium`.
    
    Since iOS enables this automatically, these numbers describe what the toggle controls — not an improvement this PR delivers on iOS.
    
    </details>
    
    Part of flutter/flutter#190598
    
    ## Pre-Review Checklist
    
    [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
    toyaji authored Oct 27, 2026
    Configuration menu
    Copy the full SHA
    4a1f3c5 View commit details
    Browse the repository at this point in the history
  4. [camera_web] Skip video input devices that cannot be started in avail…

    …ableCameras (#13196)
    
    `availableCameras` opens every video input device to read its facing mode. If one device cannot be started (for example the OBS Virtual Camera on Windows while OBS is not running), `getUserMedia` rejects with `NotReadableError` and the whole call throws `cameraNotReadable`, so the cameras that work are not returned either.
    
    This PR skips a device whose stream cannot be started and continues with the remaining devices. If no camera is available and a device failed, the first device error is still thrown, so a single broken camera keeps reporting its error instead of returning an empty list.
    
    The platform interface documents that `availableCameras` returns an empty list when no cameras are available. `availableCameras` already throws today when a device cannot be started, and this PR keeps that behavior when no device can be started at all, so a single busy or broken camera still reports why it failed. I'm happy to return an empty list instead if that is preferred.
    
    Fixes flutter/flutter#194184
    
    ## Pre-Review Checklist
    
    **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.
    
    [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
    Anfet authored Oct 27, 2026
    Configuration menu
    Copy the full SHA
    65b6fab View commit details
    Browse the repository at this point in the history
  5. [material_ui] Decouple disabled CheckboxListTile state in a11y_assess…

    …ments (#13177)
    
    Decouples the disabled `CheckboxListTile` (`enabled: false`) in `a11y_assessments`'s `/check-box-list-tile` use case from the enabled tile's mutable `_checked` state so toggling the first checkbox does not also flip the disabled checkbox to checked (the other 5 use cases originally in this branch landed in #13159 and #13243). Only the `a11y_assessments` test app changes, so no package version or CHANGELOG update is needed.
    
    Fixes flutter/flutter#194905
    
    ## Pre-Review Checklist
    
    **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.
    
    [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
    kevmoo authored Oct 27, 2026
    Configuration menu
    Copy the full SHA
    d9885d7 View commit details
    Browse the repository at this point in the history
  6. [material_ui] Unskip web tests that pass on CanvasKit and Skwasm: dat…

    …a_table_test, floating_action_button_test, text_field_cursor_test (#13460)
    
    Removes web skips from three `material_ui` test files whose tests now pass on Chrome under both web renderers used in CI (CanvasKit/dart2js and Skwasm/dart2wasm). Keeping the skips hides web regressions in these widgets.
    
    - `data_table_test.dart`: removes the file-level `@TestOn('!chrome')`. The column/cell padding finders now use `'${6.0}'` instead of `'6.0'`, so they match the text on dart2js (JS prints doubles with no fractional part as `6`, not `6.0`). Only the M3 `InkSparkle` press test stays skipped on web (flutter/flutter#100587).
    - `floating_action_button_test.dart`: removes the file-level `@TestOn('!chrome')`, which turns 43 tests back on for web. The two ink splash clipping tests stay skipped on web (flutter/flutter#20483).
    - `text_field_cursor_test.dart`: removes the file-level `@TestOn('!chrome')`. All 9 cursor animation, timing, and platform radius variants pass on web.
    
    Verified locally with `flutter test --platform chrome` and `flutter test --platform chrome --wasm` for each file.
    
    Part of flutter/flutter#100587
    Part of flutter/flutter#20483
    
    ## Pre-Review Checklist
    
    This PR only changes tests, so it is exempt from version/CHANGELOG updates and from the new-test requirement.
    
    **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.
    
    [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
    harryterkelsen authored Oct 27, 2026
    Configuration menu
    Copy the full SHA
    2066e32 View commit details
    Browse the repository at this point in the history
  7. manually roll flutter and fix flaky video player test that is prevent…

    …ing roll from landing (#13465)
    
    roll flutter and fix flake!
    tarrinneal authored Oct 27, 2026
    Configuration menu
    Copy the full SHA
    9919dfd View commit details
    Browse the repository at this point in the history

Commits on Oct 28, 2026

  1. [google_maps_flutter_ios, pigeon, webview_flutter_wkwebview] Migrate …

    …remaining example apps to uiscene (#13280)
    
    Fixes flutter/flutter#194284 (+ a bonus extra special migration for `pigeon/example/native_interop_app`!! Wow!)
    
    These four example apps got missed out in the original round of migrations.
    
    - `webview_flutter_wkwebview/example`
      - In the initial example migration [sweep](#12182), `webview_flutter/webview_flutter/example` was migrated while `webview_flutter_wkwebview/example` was missed which is understandable
    - `google_maps_flutter_ios_sdk9/example` & `google_maps_flutter_ios_sdk10/example`
      - when I [migrated](#11001) `AppDelegate.swift` in `google_maps_flutter_ios_shared_code`, the sync script copied `AppDelegate.swift` into sdk9 and sdk10. But `Info.plist `isn't in shared_code, so the script didn't copy `Info.plist`
    - `pigeon/example/native_interop_app`
      - This was landed post the round of example migrations. Its `AppDelegate.swift` already adopts `FlutterImplicitEngineDelegate`, so it only needed `UIApplicationSceneManifest` in `Info.plist`.
    
    ## Pre-Review Checklist
    
    - [] I added new tests to check the change I am making, or I have commented below to indicate which [test exemption] this PR falls under[^1].
    LouiseHsu authored Oct 28, 2026
    Configuration menu
    Copy the full SHA
    8cdc6e5 View commit details
    Browse the repository at this point in the history
  2. [material_ui] Unskip long press drag test on web (#13358)

    Follow-up to flutter/flutter#194877.
    
    `long press drag extends the selection to the word under the drag and shows toolbar on lift on non-Apple platforms` is skipped on the web, but the only thing that actually breaks there is the drag geometry: `textOffsetToPosition` nudges the position by 1px on web, so `moveBy(const Offset(-200, 0))` lands exactly on the glyph boundary between `Peel` and the following space, and `getWordAtOffset` resolves to the whitespace instead of the word. `_expectMaterialToolbarForPartialSelection()` already handles `isContextMenuProvidedByPlatform`, so the skip is not needed once the drag targets are fixed.
    
    This PR drags to the middle of each target word instead of relative offsets, drops the skip, and tags the test with `reduced-web-test-set` so it runs on the web shards. Verified with `flutter test`, `flutter test --platform chrome`, and `flutter test --platform chrome --wasm`.
    
    Test-only change, so no version bump or CHANGELOG entry is needed.
    mdebbar authored Oct 28, 2026
    Configuration menu
    Copy the full SHA
    13d38e0 View commit details
    Browse the repository at this point in the history
Loading