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: 08faf64
Choose a base ref
...
head repository: flutter/packages
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 653628e
Choose a head ref
  • 16 commits
  • 131 files changed
  • 12 contributors

Commits on Nov 10, 2026

  1. Roll Flutter from d46382112aa6 to fffd8c22ae64 (21 revisions) (#13614)

    flutter/flutter@d463821...fffd8c2
    
    2026-11-10 [email protected] Roll Fuchsia Test Scripts from 8QcsP_SmbsT09VgUs... to PXc5D7S_q6sIYpfFJ... (flutter/flutter#196273)
    2026-11-10 [email protected] [web] Accept the capped letter spacing line shift in kitchensink (flutter/flutter#196148)
    2026-11-10 [email protected] Fix Vulkan MSAA diagonal seam in FramebufferBlend (flutter/flutter#196197)
    2026-11-10 [email protected] Read back images on the raster thread on OpenGLES (flutter/flutter#195927)
    2026-11-10 [email protected] [web] Unify ui.Paint across CanvasKit and Skwasm (flutter/flutter#196071)
    2026-11-10 [email protected] Roll Fuchsia Test Scripts from p3N3B-Kchh1bthB6n... to 8QcsP_SmbsT09VgUs... (flutter/flutter#196249)
    2026-11-09 [email protected] [Impeller] Reland clipped BackdropFilter square corners fix (flutter/flutter#195716)
    2026-11-09 [email protected] [web] Recreate canvas and context on CkOffscreenSurface resize to fix WebGL clipping (flutter/flutter#192769)
    2026-11-09 [email protected] Roll Dart SDK from ee0f66fa0ad2 to a2baae273bb2 (1 revision) (flutter/flutter#196245)
    2026-11-09 [email protected] Add Mac web_tool_tests_1_2 and _2_2 in bringup (flutter/flutter#196241)
    2026-11-09 [email protected] Roll pub packages (flutter/flutter#196246)
    2026-11-09 [email protected] Increase number of 'Windows tool_integration_tests' subshards (flutter/flutter#196243)
    2026-11-09 [email protected] Roll Fuchsia Test Scripts from Jo-ZgQSNDuPsjlZ4s... to p3N3B-Kchh1bthB6n... (flutter/flutter#196238)
    2026-11-09 [email protected] Skip UIScene pre-migration test cases on Xcode 27 (flutter/flutter#194755)
    2026-11-09 [email protected] [flutter_tools] Share Analytics.isBot and make isRunningOnBot sync (flutter/flutter#194744)
    2026-11-09 [email protected] [flutter_tools] Retry chromedriver startup when its port is taken (flutter/flutter#196150)
    2026-11-09 [email protected] Remove unused vulkan_provider.cc (flutter/flutter#195513)
    2026-11-09 [email protected] Roll Dart SDK from 3b174b7217fe to ee0f66fa0ad2 (13 revisions) (flutter/flutter#196217)
    2026-11-09 [email protected] Goma is dead, long live RBE! (Take 2) (flutter/flutter#196212)
    2026-11-09 [email protected] Split DevTools customer tests into its own customer_testing_devtools shard (flutter/flutter#195871)
    2026-11-09 [email protected] Split mac_host_{debug,profile,release}_arm64_tests into one step per type (flutter/flutter#196031)
    
    If this roll has caused a breakage, revert this CL and set the roller
    to dry run mode using the controls here:
    https://autoroll.skia.org/r/flutter-packages
    Please CC [email protected],[email protected] on the revert to ensure that a human
    is aware of the problem.
    
    To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose
    
    To report a problem with the AutoRoller itself, please file a bug:
    https://issues.skia.org/issues/new?component=1389291&template=1850622
    
    Documentation for the AutoRoller is here:
    https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
    engine-flutter-autoroll authored Nov 10, 2026
    Configuration menu
    Copy the full SHA
    6fbd01a View commit details
    Browse the repository at this point in the history
  2. [web_benchmarks] Fix benchmark stalling when only repainting views th…

    …at are dirty (#13089)
    
    This is required in order to reland flutter/flutter#192128. Fixes flutter/flutter#193295.
    
    The code is little bit hairy because current stable does not have `RenderView.markNeedsCompositeFrame`. I will clean it up when that changes.
    
    ## 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.
    knopp authored Nov 10, 2026
    Configuration menu
    Copy the full SHA
    2c1c1bd View commit details
    Browse the repository at this point in the history
  3. [google_sign_in_android] Rename keep.xml to google_sign_in_keep.xml (#…

    …13475)
    
    Rename keep.xml to google_sign_in_keep.xml
    
    Fixes: flutter/flutter#194943
    
    ## Pre-Review Checklist
    mboetger authored Nov 10, 2026
    Configuration menu
    Copy the full SHA
    5ba81cb View commit details
    Browse the repository at this point in the history
  4. [camera_android] Fix stopVideoRecording returning JPEG when takePictu…

    …re runs during recording (#13070)
    
    ## Description
    
    When `takePicture()` is called during an active video recording, `stopVideoRecording()` could return the JPEG path instead of the MP4 path because a single `captureFile` field was shared.
    
    This change introduces a dedicated `videoCaptureFile` for video recording and keeps `captureFile` for still capture.
    
    ## Related Issue
    
    Fixes flutter/flutter#192927
    
    ## Tests
    
    - Unit tests in `CameraTest.java`
    - Integration test: `stopVideoRecording returns mp4 after takePicture during recording`
    
    ## Pre-Review Checklist
    Azim04 authored Nov 10, 2026
    Configuration menu
    Copy the full SHA
    0f29291 View commit details
    Browse the repository at this point in the history
  5. [cupertino_ui] Localize CupertinoActionSheet semantics label (#13377)

    `CupertinoActionSheet` wraps its content in a `Semantics` node that names and scopes the route, labelled with the hardcoded string `'Alert'`. Because this node names the route, apps can't override the label, so VoiceOver announces "Alert" in English whatever the app's locale.
    
    This PR uses `CupertinoLocalizations.of(context).alertDialogLabel` instead. `CupertinoAlertDialog` in the same file already does this, and every `cupertino_*.arb` file already translates the key (e.g. `"Alerta"` for `pt`). The English default is still `'Alert'`, so the existing semantics test is unchanged.
    
    Note: `CupertinoActionSheet` now looks up `CupertinoLocalizations`, so it needs a localizations ancestor, which `CupertinoApp` provides. `CupertinoAlertDialog` already has this requirement.
    
    Changes:
    - `lib/src/dialog.dart`: use the localized `alertDialogLabel` for the action sheet's semantics label.
    - `test/action_sheet_test.dart`: add a regression test that shows an action sheet under the `pt` locale and checks that the dialog semantics node is labelled "Alerta". The test fails before this change and passes after it.
    - `pending_changelogs/localize_action_sheet_semantics_label.yaml`: patch-level changelog entry, following the package's batch release process.
    
    Fixes flutter/flutter#195019
    
    ## 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.
    master-wayne7 authored Nov 10, 2026
    Configuration menu
    Copy the full SHA
    254a37e View commit details
    Browse the repository at this point in the history
  6. [image_picker_ios] Convert the iOS example app and UI tests to Swift (#…

    …13570)
    
    Converts the `image_picker_ios` iOS example app and UI tests from Objective-C to Swift:
    
    * `AppDelegate` is now Swift. `@main` replaces `main.m`, and `AppDelegate.h` becomes `Runner-Bridging-Header.h`.
    * `ImagePickerFromGalleryUITests` and `ImagePickerFromLimitedGalleryUITests` are now Swift.
    * The example still seeds the photo library from `jpgImageTall.jpg`, and logs when that fixture is missing.
    * Drops the `@available(iOS 14, *)` checks in the UI tests. The example already requires iOS 15.
    
    The plugin implementation is unchanged from #13493.
    
    Bumps image_picker_ios to **0.8.13+16**.
    
    Follow-up to the Obj-C → Swift migration, following #13493. Part of flutter/flutter#119107
    
    ## 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.
    victogomez-cs authored Nov 10, 2026
    Configuration menu
    Copy the full SHA
    75094a6 View commit details
    Browse the repository at this point in the history
  7. [pigeon] Support multi-engine Native Interop registration and instanc…

    …e-aware unregistration (#13576)
    
    Associates Native Interop (`useJni` / `useFfi`) `@HostApi` and `@FlutterApi` registrations with the Flutter engine that made them. Lookups route to the calling engine's registration when the engine is known, and detaching one engine removes only that engine's registration.
    
    Previously, attaching a secondary `FlutterEngine` overwrote any existing registration under the same `name`. Detaching that engine via `register(null)` then cleared the entry for all remaining engines in the process. For example, `shared_preferences_android` failed in the main engine after a background engine detached (flutter/flutter#194920).
    
    > [!NOTE]
    > Per review, the standalone `@FlutterApi` fixes (the `pigeonVar_` prefix for internal `_<Api>Registrar` members so `register` / `dartApi` no longer collide on JNI, `implement` with an empty `name`, and the `objective_c <9.6.3` test pin) are split out into #13609 so they can land on 29.x first. This PR contains only the unregistration and multi-engine changes, which depend on each other.
    
    ### Engine identity without deprecated APIs or new stable requirements
    
    `register` / `unregister` now take the engine handle that plugins and apps already have. Pigeon derives an engine key from it, so moving to `engineId` once flutter/flutter#195881 reaches `stable` is an internal change, not another breaking change:
    
    | Caller | Engine key |
    |---|---|
    | Kotlin app: `MyApiRegistrar().register(api, flutterEngine)` | `FlutterEngine.engineId` (public on stable; exact) |
    | Kotlin plugin: `MyApiRegistrar().register(api, binding)` | `binding.getEngineId()` when the embedding provides a non-zero value (#195881, detected at runtime, survives R8). Otherwise a per-engine key from `binding.binaryMessenger`. |
    | Swift: `MyApiSetup.register(api:registrar:)` | `registrar.engineIdentifier` when available and non-zero (detected at runtime). Otherwise a per-engine key from the registrar's messenger. |
    
    Generated code never calls deprecated embedding APIs such as `FlutterPluginBinding.getFlutterEngine()`. An engine ID of `0` is treated as unknown, because real IDs are never `0`. `0` shows up for registrars whose engine is already deallocating, and for unstubbed test doubles, and must not be shared between engines.
    
    Dart lookups (`createWithNativeInteropApi()` / `<HostApi>ForNativeInterop.getInstance()`) choose a registration in this order:
    1. The one whose key matches `PlatformDispatcher.instance.engineId`.
    2. Otherwise, if the isolate has no engine ID, one from the engine this isolate first resolved a handle from. This is tracked per generated Pigeon file.
    3. Otherwise, the most recent registration.
    
    Native `@FlutterApi` lookups use the same keys through `<FlutterApi>Registrar` `getInstance(binding | flutterEngine)` in Kotlin and `getInstance(registrar:)` in Swift.
    
    **Exact vs. best-effort routing.** Routing is exact whenever native code knows the engine identifier: Kotlin `register(api, flutterEngine)` always, and plugin bindings / registrars on Flutter versions that expose it. Otherwise it is best-effort. It is correct when each engine's Dart resolves its first handle from each Pigeon file at startup, but it can pick another engine's registration when:
    - Engines are created back-to-back before their Dart starts.
    - A file's first lookup happens lazily while another engine is attached.
    - Lookups come from `Isolate.spawn` / `Isolate.run` isolates.
    
    macOS plugins receive no detach callback, so macOS registrations currently outlive their engine. The README and guides document these limits and recommend platform channels / `@ProxyApi` for engine-stateful APIs in those cases. Full engine routing remains tracked in flutter/flutter#195877.
    
    ### Summary of Changes
    
    * **Engine-keyed registration stacks & `unregister`**: Each `name` keeps an ordered stack of `(engine key, instance)` entries.
      * Re-registering the same instance for the same engine moves it to the top and keeps its existing wrapper.
      * `unregister(api, engine)` removes only that engine's entry, even out of order. If the engine key can't be resolved, it falls back to matching by instance identity, but only when a single engine holds that instance.
    * **Detached `@HostApi` safety**: Calls through a handle whose instance was unregistered throw `unregistered-instance` (Kotlin/Swift) instead of crashing. Swift `Setup` wrappers use `resolveApi() throws` instead of `api!`.
    * **Engine teardown safety (Swift)**: Engine keys are cached per registrar. `unregister` from `detachFromEngine(for:)` therefore works while the engine is deallocating and its messenger is already gone.
    * **Registry thread safety**: Native Interop calls from background isolates run on worker threads. Registration maps, wrapper API references, and engine-key caches are therefore guarded internally:
      * Kotlin uses `synchronized` / `@Synchronized` and `@Volatile`.
      * Swift uses `NSLock` / `NSRecursiveLock`. Removed entries are released after unlocking, so their `deinit` doesn't run while the lock is held.
      * This doesn't make registration a thread-safe API contract. Registration is still expected on the main thread.
    * **Dart `@FlutterApi`**:
      * `<FlutterApi>.setUp(null)` deregisters only the current isolate's native callback.
      * Registering via `setUp(a)` or the registrar, then calling `setUp(null)`, now correctly removes `a`.
      * Adds `<FlutterApi>Registrar.unregister`.
      * Registrations are tagged with the isolate's engine so native lookups reach the right isolate.
    * **Documentation**:
      * Updates the README, Native Interop guide, migration guide, migration skill, and `CHANGELOG.md`, including the routing guarantees and limits above.
      * Notes that `registrar.publish(instance)` is required for iOS to call `detachFromEngine(for:)`.
    * **Tests**:
      * Generator unit tests for Dart, Kotlin, and Swift.
      * Kotlin `NativeInteropRegistrarTest`, iOS `RunnerTests`, and macOS `BasicCompileTest`. These cover:
        * the same API on two engines
        * out-of-order unregister
        * the identity fallback
        * resolve order
        * `@FlutterApi` lookup by engine
      * Real secondary-engine and multi-isolate integration tests.
      * An integration test asserting that registrations use the exact `PlatformDispatcher.instance.engineId` when the platform exposes it. It runs in minified Android release builds to cover R8.
    
    ### Breaking Native Interop API Changes (`30.0.0`)
    
    * **Engine-aware registration**:
      * `@HostApi` `register` / `unregister` take the engine: `MyApiRegistrar().register(api, binding)` / `register(api, flutterEngine)` in Kotlin, and `MyApiSetup.register(api:registrar:)` in Swift. `unregister` follows the same shape.
      * Native `@FlutterApi` lookup takes the engine: `getInstance(binding | flutterEngine)` in Kotlin and `getInstance(registrar:)` in Swift. The name-only native `getInstance` is removed.
    * **Explicit deregistration**:
      * Replaces `register(null)` / `register(api: nil)` / `registerInstance(null | nil)` with `unregister` / `unregisterInstance`, which remove only the given instance for the given engine.
      * `register` / `registerInstance` require a non-null API and return `void` / `Unit` / `Void`.
    * **Swift `@HostApi` `AnyObject` constraint**: FFI Swift `@HostApi` protocols are constrained to `AnyObject` so instances can be matched by identity.
    * **Reserved names**: `pigeonResolveInstance`, `pigeonEngineKey`, and `pigeonEngineKeyOf` are reserved as `@HostApi` method names.
    
    Part of flutter/flutter#195877
    Part of flutter/flutter#194920
    
    ## 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.
    tarrinneal authored Nov 10, 2026
    Configuration menu
    Copy the full SHA
    a75bde3 View commit details
    Browse the repository at this point in the history

Commits on Nov 11, 2026

  1. [pigeon] Adds Native Interop FFI codec serialization for NS types (#1…

    …3616)
    
    Adds support for serializing Foundation / Objective-C values (`Foundation.Data`, `NSData`, `NSArray`, and `NSDictionary`) as `Any?` in the Swift Native Interop (`useFfi: true`) hybrid codec.
    
    Previously, `PigeonInteropWriter.writeValue` only handled Swift `Array`, `Dictionary`, and `[UInt8]` values (via `PigeonInteropList`, `PigeonInteropMap`, and exact `[UInt8].self`), hitting `preconditionFailure` when Apple Foundation APIs (such as `UserDefaults`) returned `NSArray`, `NSDictionary`, or `Data`/`NSData` inside untyped `Any` values or collections. Adding `Foundation.Data`, `NSArray`, and `NSDictionary` fallbacks matches `FlutterStandardWriter` behavior and uses qualified `Foundation.Data` so it does not collide with user-defined Pigeon classes named `Data`.
    
    ## 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.
    tarrinneal authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    e900712 View commit details
    Browse the repository at this point in the history
  2. [flutter_svg] Remove failed async loads from Cache._pending (#13604)

    In `Cache.putIfAbsent`, `pendingResult.then((ByteData data) { ... })` did not attach an `onError` handler. When an asynchronous SVG load rejected (for example, `SvgNetworkLoader` failing while offline or throwing `http.ClientException` on non-2xx responses), `_pending.remove(key)` never ran—leaving the rejected `Future` permanently cached in `_pending[key]` across retries—and the unguarded child `Future` from `.then` reported an uncaught error to the active `Zone` even when callers awaited `putIfAbsent` inside `try`/`catch`.
    
    Attaches `onError` to `pendingResult.then` so failed loads evict `_pending[key]` without leaking uncaught `Zone` errors while preserving the caller's rejected `Future`.
    
    Fixes b/583860731
    
    ## 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.
    apwilson authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    99943dd View commit details
    Browse the repository at this point in the history
  3. [cupertino_ui] Include selectionHandleColor in NoDefaultCupertinoThem…

    …eData equality (#13450)
    
    `NoDefaultCupertinoThemeData.operator ==` and `hashCode` leave out `selectionHandleColor`, so two themes that differ only in that color compare equal. `CupertinoThemeData`, which extends it, already includes the field. Because `ThemeData ==` compares `cupertinoOverrideTheme`, an app that passes a `NoDefaultCupertinoThemeData` there and changes only its `selectionHandleColor` gets an "equal" `ThemeData`, and dependents aren't rebuilt.
    
    This adds the field to both methods, matching `CupertinoThemeData`, and adds a unit test.
    
    Fixes flutter/flutter#195391
    
    ## Pre-Review Checklist
    ChandraChaan authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    b762b3f View commit details
    Browse the repository at this point in the history
  4. [vector_graphics] Catch any throwable in useHtmlRenderObject() and ca…

    …che HTML fallback (#13545)
    
    In Flutter Web under the CanvasKit and WebAssembly renderers, vector graphics determine whether to use native raster rendering (`_RawVectorGraphicWidget`) or an HTML compatibility renderer (`_RawWebVectorGraphicWidget`) by calling `useHtmlRenderObject()`, which probes runtime support by recording a 1x1 `ui.Picture` and invoking `picture.toImageSync(1, 1)`.
    
    Previously, `useHtmlRenderObject()` caught only a narrow allow-list of exception types (`UnsupportedError`, `StateError`, and `NoSuchMethodError`). When WebGL surface creation or OffscreenCanvas initialization fails mid-session, CanvasKit and browser environments can throw unhandled throwables such as bare JavaScript strings (`'Canvas with id [object OffscreenCanvas] was not found'`), foreign JS errors, or `null`. Because these were unhandled, `VectorGraphic` widgets crashed, and because `useHtmlRenderObject()` is evaluated in a static field initializer, subsequent widget builds re-evaluated the uninitialized field and re-threw continuously. Furthermore, `_cachedUseHtmlRenderObject` remained `null` on failure, preventing the HTML fallback from ever being recorded.
    
    This PR updates `useHtmlRenderObject()` to catch any throwable using a bare `catch (_)` block, sets `_cachedUseHtmlRenderObject = true` on any failure, ensures `ui.Picture` and `ui.Image` resources are always disposed in `finally`, and adds unit tests covering five distinct failure modes, success path caching, and reset lifecycle transitions.
    
    Fixes flutter/flutter#189451
    
    ## Behavioral Changes
    - Before: When `picture.toImageSync(1, 1)` threw non-Dart errors (such as bare JavaScript strings or foreign JS errors during WebGL/canvas failures), the throwable escaped unhandled from `useHtmlRenderObject()`, crashing `VectorGraphic` widget build passes and re-throwing repeatedly without caching a fallback.
    - After: Any throwable thrown during `toImageSync(1, 1)` is caught, causing `useHtmlRenderObject()` to return `true` (selecting the HTML compatibility render object) and permanently cache `_cachedUseHtmlRenderObject = true` so subsequent widget builds reuse the fallback without re-triggering the failing probe.
    
    ## Where to focus
    - **Key Architectural Decisions**:
      - Replaced specific `on` exception clauses with an open `catch (_)` block in `render_object_selection.dart`. On web compilation targets (`dart2js` and `dart2wasm`), host JavaScript runtimes can throw arbitrary values (including bare strings, JS objects, or null); Dart null safety excludes `null` from `Object`, making `catch (_)` the only clause that intercepts every possible thrown entity.
      - Latching `_cachedUseHtmlRenderObject = true` on any caught throwable prevents repeat probe execution and CPU thrashing during environmental rendering failures.
    - **Non-Obvious Logic**:
      - Checking `if (_cachedUseHtmlRenderObject != null)` prior to `if (!kIsWeb && debugToImageSyncOverride == null)` allows non-web test environments (such as the Dart VM) to hermetically simulate both probe success and probe failure via `debugToImageSyncOverride` without allocating native browser surfaces.
    - **Primary Review Files**:
      - `packages/vector_graphics/lib/src/render_object_selection.dart`: Core fallback catch and caching logic.
      - `packages/vector_graphics/test/render_object_selection_test.dart`: Hermetic unit test suite covering string, error, exception, null, and foreign object throws, plus caching and reset semantics.
    
    ## 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.
    harryterkelsen authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    5a7871b View commit details
    Browse the repository at this point in the history
  5. [shared_preferences] Updates Pigeon to 30.0.1 to support multi-engine…

    … registration and deregistration. (#13617)
    
    Updates `shared_preferences_android` and `shared_preferences_foundation` to Pigeon 30.0.1 and `jni` `^1.1.1`.
    
    - Supports multi-engine registration and deregistration.
    - Removes the manual web stub/real FFI export and R8 consumer rules workarounds.
    
    fixes flutter/flutter#194920
    tarrinneal authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    7729836 View commit details
    Browse the repository at this point in the history
  6. [cupertino_ui] Fix CupertinoSheetRoute throwing when a drag ends duri…

    …ng a pending relayout (#13316)
    
    Dragging a `CupertinoSheetRoute` converts drag deltas and the release velocity into fractions of the sheet's height. Both drag paths read that height from `context.size`: `_CupertinoDragGestureDetectorState.sheetHeight` for regular sheets, and `_dragUpdate` / `_handleDragEnd` in `_CupertinoDraggableScrollableSheetState` for sheets built with `scrollableBuilder`. `Element.size` asserts when the render object is dirty for layout, so a drag that ends while a relayout is pending throws `Cannot get size from a render object that has been marked dirty for layout.` The reporter saw it cascade into `_drag == null` asserts in `ScrollableState`, after which the sheet stopped responding. In release the assert is stripped and the read returns the last laid out size.
    
    The fix reads the height from the `RenderBox` directly. That's the size the sheet was last laid out at, which is the size the drag was made against, and it's what release builds were already using. The Material `BottomSheet` reads its height for drag updates and fling velocity the same way (`_childHeight`).
    
    ## Tests
    
    Two regression tests, one per drag path. Each starts a partial drag, marks the box the sheet measures as dirty, and releases before the next frame. Both fail on `main` with the assertion above, and both pass with the fix, with the sheet settling back to where it started. The rest of `sheet_test.dart` passes as well (44 tests in total).
    
    One limitation: the reporter hit this on a device when the keyboard was dismissed mid-drag. Changing the view insets mid-drag in a widget test doesn't reproduce it, because the relayout that follows lands before the pointer up. So the tests set up the condition from the reporter's stack trace directly, not the keyboard sequence.
    
    Fixes flutter/flutter#194681
    
    ## Pre-Review Checklist
    
    I used AI tooling while working on this, and reviewed and tested all of it myself.
    
    [^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.
    theprantadutta authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    054d9d1 View commit details
    Browse the repository at this point in the history
  7. [pigeon] Fix basePath resolution when paths share a string prefix wit…

    …h basePath (#13342)
    
    Replaces string-prefix `!....startsWith(basePath)` checks across `ffigen_config_generator.dart`, `jnigen_config_generator.dart`, `pigeon_lib.dart`, and `pigeon_lib_internal.dart` with a path-aware `isWithinOrEquals(basePath, ...)` helper using `path.posix.equals` and `path.posix.isWithin`.
    
    Previously, when `basePath` was set (e.g. `basePath: 'app'`) and an output or directory path happened to start with the same string prefix without being inside `basePath` (e.g. `dartOut: 'app_bindings/lib/src/messages.g.dart'`), `.startsWith(basePath)` evaluated to `true` and skipped prepending `basePath`, while `_getFile` unconditionally joined `basePath` and `output`.
    
    Follow-up from #13283 (review).
    tarrinneal authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    86509a5 View commit details
    Browse the repository at this point in the history
  8. [material_ui] Document how to programmatically clear DropdownMenu sel…

    …ection (#13266)
    
    ## Description
    
    Clarifies how to programmatically clear or reset the selection in `DropdownMenu`.
    
    Setting initialSelection to null on a rebuild does not clear the text field, because DropdownMenu only updates the text field when initialSelection changes to a value that matches one of the dropdownMenuEntries. This PR documents that the selection should be cleared by providing a TextEditingController and calling controller.clear() alongside setting the state variable to null, and adds an interactive code sample demonstrating this pattern.
    
    Fixes flutter/flutter#177599
    
    ## 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.
    dkbharti-glitch authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    b9397f2 View commit details
    Browse the repository at this point in the history
  9. Roll Flutter from fffd8c22ae64 to b98afb524077 (31 revisions) (#13623)

    flutter/flutter@fffd8c2...b98afb5
    
    2026-11-11 [email protected] Roll Dart SDK from 172cf8f121c0 to 8f15c4ca2d41 (1 revision) (flutter/flutter#196367)
    2026-11-11 [email protected] Roll Skia from 657283e78115 to cc4c54f752ba (5 revisions) (flutter/flutter#196365)
    2026-11-11 [email protected] Roll Skia from 2605c4a9761c to 657283e78115 (1 revision) (flutter/flutter#196358)
    2026-11-11 [email protected] Roll Dart SDK from 890c6d15334c to 172cf8f121c0 (1 revision) (flutter/flutter#196352)
    2026-11-11 [email protected] [flutter_tools] Migrate general.shard project, runner, and web tests off globals (flutter/flutter#196128)
    2026-11-11 [email protected] [flutter_tools] Migrate test helpers and integration tests off globals (flutter/flutter#196124)
    2026-11-11 [email protected] [web] Report skwasm WebGL context creation failure instead of hanging (flutter/flutter#193293)
    2026-11-11 [email protected] [flutter_tools] Migrate commands.shard tests off globals (flutter/flutter#196139)
    2026-11-11 [email protected] [devicelab] Fix memory benchmark tap synchronization and swipe flakes (flutter/flutter#194457)
    2026-11-11 [email protected] Roll Skia from 06062e36d938 to 2605c4a9761c (2 revisions) (flutter/flutter#196350)
    2026-11-11 [email protected] Do not wait again for a closed mock event stream in tear down (flutter/flutter#196110)
    2026-11-11 [email protected] [gen_l10n] Add `use-explicit-plural-values` option (flutter/flutter#194816)
    2026-11-11 [email protected] Roll Skia from 7bd33f8a3b70 to 06062e36d938 (2 revisions) (flutter/flutter#196340)
    2026-11-11 [email protected] Skip redundant work in plugin_test_* (flutter/flutter#196258)
    2026-11-10 [email protected] Drop test_timeout_secs from shards that no longer need it (flutter/flutter#196277)
    2026-11-10 [email protected] Roll Dart SDK from 15c1699d3eeb to 890c6d15334c (1 revision) (flutter/flutter#196321)
    2026-11-10 [email protected] iOS: Extract FlutterPlatformViewsController platform-thread state to Obj-C (flutter/flutter#196142)
    2026-11-10 [email protected] Remove `Mac web_tool_tests` and take new subshard builders out of bringup (flutter/flutter#196276)
    2026-11-10 [email protected] Roll Skia from 9c3d43d8a04b to 7bd33f8a3b70 (12 revisions) (flutter/flutter#196317)
    2026-11-10 [email protected] Take customer_testing_devtools out of bringup (flutter/flutter#196239)
    2026-11-10 [email protected] Roll ICU from a0ea93436c52 to b09986242cfb (1 revision) (flutter/flutter#196316)
    2026-11-10 [email protected] [flutter_tools] Avoid unlinking native_assets.json and handle EXDEV (flutter/flutter#196134)
    2026-11-10 [email protected] Remove old `Windows tool_integration_tests` builders and take the new shards out of bringup (flutter/flutter#196275)
    2026-11-10 [email protected] [SwiftPM] Disable tests for when settings fail to compile (flutter/flutter#196310)
    2026-11-10 [email protected] Roll Fuchsia Test Scripts from PXc5D7S_q6sIYpfFJ... to oEU515sDqSTvD8Spx... (flutter/flutter#196289)
    2026-11-10 [email protected] Fix ime insets animation jump (flutter/flutter#191453)
    2026-11-10 [email protected] Link to original PR in automatic cherry-pick PRs (flutter/flutter#196130)
    2026-11-10 [email protected] Roll Packages from 565c657 to 08faf64 (9 revisions) (flutter/flutter#196296)
    2026-11-10 [email protected] Roll Skia from b11315d0a096 to 9c3d43d8a04b (45 revisions) (flutter/flutter#196295)
    2026-11-10 [email protected] Replace type-specific window widgets with a single Window widget (flutter/flutter#196002)
    2026-11-10 [email protected] Roll Dart SDK from a2baae273bb2 to 15c1699d3eeb (2 revisions) (flutter/flutter#196294)
    
    If this roll has caused a breakage, revert this CL and set the roller
    to dry run mode using the controls here:
    https://autoroll.skia.org/r/flutter-packages
    Please CC [email protected],[email protected] on the revert to ensure that a human
    is aware of the problem.
    
    To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose
    
    To report a problem with the AutoRoller itself, please file a bug:
    https://issues.skia.org/issues/new?component=1389291&template=1850622
    
    Documentation for the AutoRoller is here:
    https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
    engine-flutter-autoroll authored Nov 11, 2026
    Configuration menu
    Copy the full SHA
    653628e View commit details
    Browse the repository at this point in the history
Loading