Skip to content

Add mouseCursor to RawScrollbar - #185750

Merged
auto-submit[bot] merged 9 commits into
flutter:masterfrom
gabrimatic:scrollbar-mouse-cursor
Sep 2, 2026
Merged

auto-submit[bot] merged 9 commits into
flutter:masterfrom
gabrimatic:scrollbar-mouse-cursor

Conversation

@gabrimatic

@gabrimatic gabrimatic commented Apr 29, 2026 •

Copy link
Copy Markdown
Contributor

Description

Adds a mouseCursor property to RawScrollbar, allowing callers to customize the mouse cursor over the scrollbar's thumb/track via a WidgetStateProperty<MouseCursor?>. It resolves with WidgetState.hovered while the pointer is over the painted scrollbar, WidgetState.dragged while a thumb drag is active, and WidgetState.disabled while the scrollbar is not interactive.

The override is gated to apply only while the pointer is over the painted scrollbar, using the same hit-test region that already drives hover behavior. When the pointer is anywhere else inside the scroll view's child, cursor resolution is deferred to ancestors, so a parent widget's cursor, such as an enclosing EditableText's I-beam, is preserved. This is the core fix for the scenario described in #185733: today, the scrollbar's MouseRegion swallows the ancestor cursor for the entire scroll-view area. With this change, only the painted scrollbar surface participates in cursor resolution.

When mouseCursor is null, or when its resolved value is null, MouseCursor.defer is used and ancestor cursors are left unchanged everywhere.

The hover callbacks are only installed while the scrollbar is interactive, and the thumb drag recognizers only exist while the child is scrollable. When either stops being true the callbacks simply stop arriving, and a dropped drag recognizer is disposed without reporting a cancel, so the pointer state that feeds the cursor is released explicitly: when a mouse or trackpad thumb drag ends, when interactive changes, and when the child stops being scrollable. Without that, the resolved cursor could stay applied over the whole scroll view with no event left to clear it.

One user-visible side effect worth calling out: after a mouse thumb drag that ends away from the scrollbar, the fade-out timer is no longer restarted by the following hover-exit, so the scrollbar can begin fading up to timeToFade earlier than before. That matches the behavior a touch drag already had.

Why framework-only

flutter/flutter is currently under a Material/Cupertino code freeze (#184093). Per the freeze guidance, the framework-side change can land now, and the corresponding Scrollbar / ScrollbarThemeData surfacing requested in #185733 will be ported to material_ui in flutter/packages once that repo opens for changes. This PR is therefore scoped to lib/src/widgets/scrollbar.dart and its widget-layer tests only.

The framework API alone is enough to fix the reported scenario: an I-beam cursor over a TextField's scrollable region remains intact when hovering content but switches over the scrollbar. See the test RawScrollbar.mouseCursor only applies while the pointer is over the scrollbar.

This PR uses a non-closing Refs #185733 so the issue stays open to track the remaining Scrollbar / ScrollbarThemeData work, which will land separately in flutter/packages.

Tests

Nine widget-layer tests in test/widgets/scrollbar_test.dart:

  • RawScrollbar.mouseCursor only applies while the pointer is over the scrollbar verifies an ancestor MouseRegion(cursor: text) keeps the I-beam over the content area, switches to the scrollbar's cursor over the thumb, yields back to the I-beam when leaving the scrollbar, and passes exactly WidgetState.hovered to the cursor resolver while hovering.
  • RawScrollbar.mouseCursor resolves a WidgetStateProperty.fromMap verifies the WidgetStateProperty contract end to end: hovered, dragged, map precedence, and the fallback back to the hovered entry on release.
  • RawScrollbar without mouseCursor preserves the ancestor cursor over the scrollbar verifies the default behavior: with no override set, the ancestor cursor wins everywhere, including over the scrollbar.
  • RawScrollbar.mouseCursor updates when the property changes while hovered verifies that prop changes during hover are picked up.
  • RawScrollbar.mouseCursor stays applied while a thumb drag is active even when the pointer leaves the scrollbar verifies that a dragged cursor remains stable during an active thumb drag.
  • RawScrollbar.mouseCursor is released when a mouse drag ends off the scrollbar verifies a single-pointer desktop drag: pressing the thumb, dragging into the content area, and releasing there hands the cursor straight back to the ancestor.
  • RawScrollbar.mouseCursor is released when the scrollbar stops being interactive verifies that flipping interactive to false, both while hovering and mid-drag, releases the override.
  • RawScrollbar.mouseCursor is released when the child stops being scrollable verifies that shrinking the child mid-drag releases the dragged state.
  • RawScrollbar.mouseCursor clears dragged state when thumb drag is cancelled verifies that cancellation resets the dragged cursor state.

Each of the three release paths was confirmed to fail without its fix.

Verification run locally:

  • ./bin/dart format --output=none --set-exit-if-changed packages/flutter/lib/src/widgets/scrollbar.dart packages/flutter/test/widgets/scrollbar_test.dart
  • ./bin/flutter analyze --current-package --no-pub packages/flutter/lib/src/widgets/scrollbar.dart packages/flutter/test/widgets/scrollbar_test.dart
  • ./bin/flutter test packages/flutter/test/widgets/scrollbar_test.dart (112 passing)
  • ./bin/flutter test packages/flutter/test/widgets/ (7181 passing)
  • ./bin/flutter test packages/flutter/test/material/scrollbar_test.dart packages/flutter/test/cupertino/scrollbar_test.dart and the other suites that build a scrollbar
  • git diff --check upstream/master...HEAD

Refs #185733

@google-cla

google-cla Bot commented Apr 29, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@github-actions github-actions Bot added framework flutter/packages/flutter repository. See also f: labels. p: material_ui material_ui package in flutter/packages f: scrolling Viewports, list views, slivers, etc. labels Apr 29, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a mouseCursor property to Scrollbar, RawScrollbar, and ScrollbarThemeData, allowing customization of the mouse cursor during hover and drag interactions. The review feedback identifies several improvement opportunities, including handling drag cancellations to properly reset internal state, optimizing performance by reducing redundant setState calls, and ensuring the cursor remains consistent during an active drag even if the pointer moves outside the scrollbar track. Documentation updates were also suggested to align with these proposed behavioral changes.

Comment thread packages/flutter/lib/src/widgets/scrollbar.dart Outdated
Comment thread packages/flutter/lib/src/widgets/scrollbar.dart
Comment thread packages/flutter/lib/src/widgets/scrollbar.dart Outdated
Comment thread packages/flutter/lib/src/widgets/scrollbar.dart Outdated
@gabrimatic
gabrimatic force-pushed the scrollbar-mouse-cursor branch from 15914d1 to f286ac9 Compare April 29, 2026 16:16
@gabrimatic gabrimatic changed the title Add mouseCursor to RawScrollbar, Scrollbar, and ScrollbarThemeData Add mouseCursor to RawScrollbar Apr 29, 2026
@github-actions github-actions Bot removed the p: material_ui material_ui package in flutter/packages label Apr 29, 2026
@gabrimatic

Copy link
Copy Markdown
Contributor Author

Updated this PR after the Check Code Freeze failure: the Material/Cupertino changes have been removed, and this PR is now scoped to the framework only (lib/src/widgets/scrollbar.dart + widget-layer tests). The Scrollbar / ScrollbarThemeData surfacing of mouseCursor will be ported to material_ui in flutter/packages once that repo opens for changes, per the guidance in #184093.

The framework-side fix is enough to resolve the original I-beam-over-TextField scenario reported in #185733, since Scrollbar ultimately wraps RawScrollbar. The override is gated to apply only while the pointer is over the painted scrollbar; everywhere else, cursor resolution defers to ancestors.

@gabrimatic
gabrimatic force-pushed the scrollbar-mouse-cursor branch 7 times, most recently from 26425ff to d769e29 Compare May 2, 2026 09:08
gabrimatic added 2 commits May 5, 2026 20:43
Introduce a WidgetStateProperty<MouseCursor?>-based override on
RawScrollbar so callers can drive the cursor over the scrollbar's
thumb/track from hovered/dragged WidgetStates. The override is gated
to apply only while the pointer is over the painted scrollbar or
while a thumb drag is in progress, so ancestor cursors (e.g. a
TextField's I-beam) remain in effect over non-scrollbar regions.

Keeping the override applied while a drag is active prevents the
cursor from flickering back to the ancestor cursor if the pointer
briefly leaves the painted track during a drag, and matches the
typical native behavior of grab/grabbing cursors.

To avoid spurious rebuilds, only call updateMouseCursor() when the
hover-active state actually changes, and reset _dragIsActive (and
re-resolve the cursor) when the thumb drag is cancelled by another
gesture taking over.

The Scrollbar/ScrollbarThemeData surfacing of this property in the
material library is omitted here due to the active material/cupertino
code freeze (flutter#184093) and will be ported to material_ui in
flutter/packages once that repo opens for changes, per the freeze
guidance.

Refs flutter#185733
@gabrimatic
gabrimatic force-pushed the scrollbar-mouse-cursor branch from d769e29 to bc80937 Compare May 5, 2026 18:44
@justinmc
justinmc requested a review from dkwingsmt May 5, 2026 22:25
@justinmc

justinmc commented May 5, 2026

Copy link
Copy Markdown
Contributor

I guess this is a partial fix for #185813 then because of the code freeze?

@gabrimatic

Copy link
Copy Markdown
Contributor Author

Yes, that's right. This PR is the framework-side RawScrollbar part of #185813 while the Material/Cupertino API surface is frozen. It still fixes the reported TextField scenario through the lower-level scrollbar path, and the Scrollbar / ScrollbarThemeData API can follow in flutter/packages after the freeze.

@dkwingsmt dkwingsmt left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with the approach. But mouse cursors should not need to detect hovering. Because in Flutter, the mouse cursor property is only applied when the pointer is over the widget.

Comment thread packages/flutter/lib/src/widgets/scrollbar.dart
@gabrimatic
gabrimatic requested a review from dkwingsmt May 27, 2026 06:07
Comment thread packages/flutter/lib/src/widgets/scrollbar.dart Outdated
@justinmc
justinmc requested a review from dkwingsmt July 28, 2026 22:20

@dkwingsmt dkwingsmt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM except for a doc improvement. Thank you!

Comment thread packages/flutter/lib/src/widgets/scrollbar.dart Outdated

@Piinks Piinks left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have to finish review here, there are a few things to address. Just blocking merging while I finish

@Piinks Piinks left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for working on this! The overall mechanism of using MouseRegion with MouseCursor.defer to resolve #185733 and prevent swallowing ancestor cursors is the right approach.

First, I want to acknowledge that a previous review comment suggested removing WidgetState.hovered tracking because typical Flutter widgets don't need manual hover state for mouse cursors, and I recognize it can be frustrating to receive conflicting reviewer direction after following that feedback.

However, after taking a closer look at the architecture, RawScrollbar is fundamentally different from typical widgets like IconButton or ElevatedButton:

  • Standard widgets have their own RenderBox matching their visual geometry, so a wrapping MouseRegion naturally applies only to that widget.
  • RawScrollbar is a CustomPaint (foregroundPainter: scrollbarPainter) that wraps the entire scrollable child viewport (which could be an 800x600 SingleChildScrollView, ListView, or TextField). The painted scrollbar thumb and track are only a thin strip on that canvas.
  • Because RawScrollbar's MouseRegion covers the entire viewport, we must determine if the pointer is actually hovering over the painted scrollbar/track area (via isPointerOverScrollbar) and defer to ancestors when it isn't.
  • Furthermore, from an API consumer's standpoint, when the pointer is over the painted scrollbar track or thumb, the scrollbar is in the WidgetState.hovered state. Removing WidgetState.hovered breaks standard WidgetStateProperty constructs (such as WidgetStateProperty.fromMap({WidgetState.hovered: ...})), because callers receive <WidgetState>{} (the empty set, which semantically denotes unhovered/idle).

There is also a cursor-leak bug when releasing a drag outside the track.

Detailed inline comments with explanations and suggested fixes are below.

///
/// Subclasses can override this to add additional states.
@protected
Set<WidgetState> get cursorStates => <WidgetState>{if (_dragIsActive) WidgetState.dragged};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know earlier feedback suggested removing hover detection for mouse cursors, but in RawScrollbar's case, keeping WidgetState.hovered is necessary for the WidgetStateProperty contract.

Why RawScrollbar is different:

  1. For standard widgets (like IconButton or ElevatedButton), the widget's RenderBox bounds match its painted bounds, so a static MouseRegion only triggers when the pointer is over the widget.
  2. In contrast, RawScrollbar is a CustomPaint wrapping the entire scroll view child. Because the scrollbar painter paints onto the larger viewport canvas, _hoverIsActive (via isPointerOverScrollbar) is needed to distinguish when the mouse is over the painted scrollbar vs when it's hovering the rest of the child content.
  3. Semantically, when the pointer is hovering over the painted scrollbar track or thumb, the scrollbar is hovered. If cursorStates returns <WidgetState>{} during hover, standard Flutter WidgetStateProperty usages fail silently:
    RawScrollbar(
      mouseCursor: WidgetStateProperty.fromMap(<WidgetStatesConstraint, MouseCursor?>{
        WidgetState.dragged: SystemMouseCursors.grabbing,
        WidgetState.hovered: SystemMouseCursors.grab,
      }),
      ...
    )
    Because states is {}, fromMap cannot match WidgetState.hovered, returning null and leaving the cursor as defer. Callers using resolveWith also cannot distinguish idle/unhovered from hovered.

Suggested Fix:

  1. Include WidgetState.hovered in cursorStates whenever _hoverIsActive is true:
@protected
Set<WidgetState> get cursorStates => <WidgetState>{
  if (_dragIsActive) WidgetState.dragged,
  if (_hoverIsActive) WidgetState.hovered,
  if (!enableGestures) WidgetState.disabled,
};
  1. Update the DartDoc on RawScrollbar.mouseCursor to state that it resolves with:
    • WidgetState.hovered when the mouse pointer is over the painted scrollbar track/thumb.
    • WidgetState.dragged while dragging the scrollbar thumb.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restored, using your body verbatim, in 1c8c90f.

One note on WidgetState.disabled so it is not a surprise later: handleHover is only wired up while enableGestures is true, so a non-interactive scrollbar never enters the hovered state and the resolved cursor is not applied. The state is therefore reported but cannot currently change the cursor. I documented that explicitly rather than dropping the line, since you asked for it. Happy to remove it if you would rather not expose a state that has no effect yet.

/// The cursor for a mouse pointer when it enters or is hovering over the
/// scrollbar's thumb or track.
///
/// Resolves in the following [WidgetState]s:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once WidgetState.hovered is restored to cursorStates, please update this doc block:

  /// Resolves in the following [WidgetState]s:
  ///  * [WidgetState.dragged].
  ///  * [WidgetState.hovered].
  ///
  /// The [WidgetState.hovered] state is resolved when the pointer is over the
  /// painted scrollbar track or thumb (using the same hit test area as hover
  /// interactions). The [WidgetState.dragged] state is resolved while the
  /// scrollbar thumb is being dragged.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in 1c8c90f. It now lists WidgetState.dragged, WidgetState.hovered and WidgetState.disabled, and says when each one resolves.

RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1),
SystemMouseCursors.basic,
);
expect(resolvedStates.last, isNot(contains(WidgetState.hovered)));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once WidgetState.hovered is included in cursorStates, this assertion should be updated to expect contains(WidgetState.hovered) when the pointer is over the scrollbar.

Please also consider adding a test verifying that WidgetStateProperty.fromMap works with WidgetState.hovered.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flipped, and it now also asserts that dragged and disabled are absent while hovering, and that hovered is gone once the pointer moves back to the content.

Added RawScrollbar.mouseCursor resolves a WidgetStateProperty.fromMap, using your exact map. It covers hovering, dragging, the map ordering that makes dragged win over hovered, and the fallback back to the hovered entry on release.

);
});

testWidgets(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test uses a synthetic two-pointer setup (a touch pointer 2 dragging while a mouse pointer 1 hovers).

Please add a test covering a single-pointer desktop mouse drag:

  • Mouse down on thumb -> move pointer into the content area -> verify cursor is grabbing.
  • Mouse up in the content area -> verify cursor reverts immediately to ancestor cursor (text / defer).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, that was a real leak. Hover events are not delivered while a pointer button is down, so _hoverIsActive was still true from before the press, and releasing over the content left the hovered cursor applied until the next pointer move.

_handleThumbDragEnd now recomputes the hover state from the position the drag ended at, before handleThumbPressEnd resolves the cursor. Only mouse and trackpad drags do this, so a touch drag cannot clobber the hover state of a separate mouse pointer.

Added RawScrollbar.mouseCursor is released when a mouse drag ends off the scrollbar, following your steps exactly. It fails on the unpatched framework at the assertion after mouse up.

Auditing that path turned up two more ways the cursor could get stuck, both worse because no later event could clear them at all. Details in the summary comment below.

Restore WidgetState.hovered to cursorStates, alongside
WidgetState.disabled, so WidgetStateProperty.fromMap and resolveWith can
tell an idle scrollbar from a hovered one.

Release the pointer state that feeds the cursor whenever no later event
could clear it. Hover events are not delivered while a pointer button is
down, so the hover state is recomputed when a mouse or trackpad thumb
drag ends. The hovered and dragged states are also released when the
scrollbar stops being interactive, or when its child stops being
scrollable and the thumb drag recognizer is dropped without reporting a
cancel. Without this the resolved cursor stayed applied over the whole
scroll view.

Refer to EditableText rather than TextField, so the doc imports stay on
the widgets side of the Material split.
@gabrimatic
gabrimatic dismissed stale reviews from navaronbracke and dkwingsmt via 1c8c90f July 31, 2026 14:12
@flutter-dashboard flutter-dashboard Bot removed the CICD Run CI/CD label Jul 31, 2026
@gabrimatic

Copy link
Copy Markdown
Contributor Author

Thanks @Piinks, all six comments are addressed in 1c8c90f, with replies on each thread. WidgetState.hovered and WidgetState.disabled are back in cursorStates using your exact body, and the DartDoc now documents all three states.

On the cursor leak you spotted: hover events are not delivered while a pointer button is held down, so _hoverIsActive was stale when a drag ended and releasing over the content left the hovered cursor applied until the next pointer move. _handleThumbDragEnd now recomputes the hover state from the drag's end position before handleThumbPressEnd resolves the cursor, for mouse and trackpad drags only, so a touch drag cannot clobber the hover state of a separate mouse pointer.

Auditing that path turned up two more ways the cursor could get stuck, both worse, because in these cases no later event could clear it at all:

  • interactive going false while hovering or mid-drag. The MouseRegion callbacks are gated on enableGestures, so the resolved cursor stayed applied over the entire scroll view permanently.
  • The child becoming unscrollable mid-drag. _gestures drops the thumb drag recognizer, which is then disposed without reporting a cancel, so the dragged state never cleared.

_releaseStalePointerState now releases the affected state from didUpdateWidget and from the scroll metrics handler. Each of the three paths has a regression test that I confirmed fails without its fix.

One user-visible side effect worth flagging: after a mouse thumb drag that ends away from the scrollbar, the fade-out timer is no longer restarted by the following hover-exit, so the scrollbar can begin fading up to timeToFade earlier than before. That matches what a touch drag already did. The PR description has been updated to cover all of this.

Also applied @navaronbracke's two nits.

Locally: format and analyze clean, test/widgets/scrollbar_test.dart 112 passing, the full test/widgets/ 7181 passing, plus the Material and Cupertino scrollbar suites and the other suites that build a scrollbar.

@Hari-07 Hari-07 added the CICD Run CI/CD label Aug 1, 2026

@Piinks Piinks left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@dkwingsmt dkwingsmt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thank you for the continued polishing!

@dkwingsmt dkwingsmt added the autosubmit Merge PR when tree becomes green via auto submit App label Aug 28, 2026
@flutter-dashboard flutter-dashboard Bot removed the CICD Run CI/CD label Aug 28, 2026
@justinmc justinmc added the CICD Run CI/CD label Sep 1, 2026
@auto-submit
auto-submit Bot added this pull request to the merge queue Sep 1, 2026
Merged via the queue into flutter:master with commit 04daa25 Sep 2, 2026
25 of 26 checks passed
@flutter-dashboard flutter-dashboard Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Sep 2, 2026
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Sep 4, 2026
flutter/flutter@0cbd1a4...70797e1

2026-09-02 [email protected] [analysis] Upgrade package:analyzer to 14.3.0 and enable custom plugin compilation (flutter/flutter#191590)
2026-09-02 [email protected] Roll Dart SDK from d8d7869d8031 to 9a8fbde80f6c (1 revision) (flutter/flutter#192179)
2026-09-02 [email protected] Roll Skia from dec311244db4 to ae22da2e8308 (1 revision) (flutter/flutter#192177)
2026-09-02 [email protected] [tool] Migrate DoctorCommand to modular dependency injection (flutter/flutter#190758)
2026-09-02 [email protected] Roll Skia from 482b7e285244 to dec311244db4 (3 revisions) (flutter/flutter#192161)
2026-09-02 [email protected] Roll Skia from 28447e9fb8d5 to 482b7e285244 (3 revisions) (flutter/flutter#192157)
2026-09-02 [email protected] feat: Add placeholder to DecorationImage (flutter/flutter#191528)
2026-09-02 [email protected] [Android] Do not schedule engine frames on a detached FlutterJNI (flutter/flutter#191204)
2026-09-02 [email protected] Roll Skia from 3a242fb7cdb3 to 28447e9fb8d5 (1 revision) (flutter/flutter#192145)
2026-09-02 [email protected] Roll Dart SDK from 9164def35347 to d8d7869d8031 (2 revisions) (flutter/flutter#192144)
2026-09-02 [email protected] Add FadeInImageTransition.fadeInOver to fade the image in over the placeholder (flutter/flutter#186246)
2026-09-02 [email protected] Roll Skia from 63d13ec4df6d to 3a242fb7cdb3 (9 revisions) (flutter/flutter#192138)
2026-09-02 [email protected] [flutter_tools] Add --no-plugins flag and disable plugins for benchmark (flutter/flutter#192129)
2026-09-02 [email protected] [tool] Migrate ChannelCommand to modular dependency injection (flutter/flutter#190751)
2026-09-01 [email protected] Add mouseCursor to RawScrollbar (flutter/flutter#185750)
2026-09-01 [email protected] Fix self-comparison and assert typos in TestSemantics (flutter/flutter#191938)
2026-09-01 [email protected] [Linux] Wait for frames to be rendered before using them in another context (flutter/flutter#192094)
2026-09-01 [email protected] [wimp] Turn on multithreading for wimp. (flutter/flutter#191747)
2026-09-01 [email protected] Roll Skia from 3911a1fe7f7a to 63d13ec4df6d (6 revisions) (flutter/flutter#192125)
2026-09-01 [email protected] Remove the redundant flutter/shell/platform/android:robolectric_tests build target (flutter/flutter#192117)
2026-09-01 [email protected] [iOS] Preserve semantics parents after reparenting (flutter/flutter#189686)
2026-09-01 [email protected] [flutter_tools] Report preview reload timing analytics in LspPreviewDetector (flutter/flutter#192120)
2026-09-01 [email protected] [flutter_tools] Implement Templates slice and flutter create integration (flutter/flutter#191748)
2026-09-01 [email protected] Uiscene migrate add2app hosts (flutter/flutter#191847)
2026-09-01 [email protected] Roll Packages from d642322 to 7a7912f (8 revisions) (flutter/flutter#192119)
2026-09-01 [email protected] [web] Anchor flt-semantics-host at 0,0 to fix WebKit semantics offset (flutter/flutter#190486)
2026-09-01 [email protected] Replace Shell::WaitForFirstFrame with an asynchronous API that matches the Shell threading model (flutter/flutter#191841)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages
Please CC [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
victorsanni pushed a commit to victorsanni/packages that referenced this pull request Sep 9, 2026
…r#12727)

flutter/flutter@0cbd1a4...70797e1

2026-09-02 [email protected] [analysis] Upgrade package:analyzer to 14.3.0 and enable custom plugin compilation (flutter/flutter#191590)
2026-09-02 [email protected] Roll Dart SDK from d8d7869d8031 to 9a8fbde80f6c (1 revision) (flutter/flutter#192179)
2026-09-02 [email protected] Roll Skia from dec311244db4 to ae22da2e8308 (1 revision) (flutter/flutter#192177)
2026-09-02 [email protected] [tool] Migrate DoctorCommand to modular dependency injection (flutter/flutter#190758)
2026-09-02 [email protected] Roll Skia from 482b7e285244 to dec311244db4 (3 revisions) (flutter/flutter#192161)
2026-09-02 [email protected] Roll Skia from 28447e9fb8d5 to 482b7e285244 (3 revisions) (flutter/flutter#192157)
2026-09-02 [email protected] feat: Add placeholder to DecorationImage (flutter/flutter#191528)
2026-09-02 [email protected] [Android] Do not schedule engine frames on a detached FlutterJNI (flutter/flutter#191204)
2026-09-02 [email protected] Roll Skia from 3a242fb7cdb3 to 28447e9fb8d5 (1 revision) (flutter/flutter#192145)
2026-09-02 [email protected] Roll Dart SDK from 9164def35347 to d8d7869d8031 (2 revisions) (flutter/flutter#192144)
2026-09-02 [email protected] Add FadeInImageTransition.fadeInOver to fade the image in over the placeholder (flutter/flutter#186246)
2026-09-02 [email protected] Roll Skia from 63d13ec4df6d to 3a242fb7cdb3 (9 revisions) (flutter/flutter#192138)
2026-09-02 [email protected] [flutter_tools] Add --no-plugins flag and disable plugins for benchmark (flutter/flutter#192129)
2026-09-02 [email protected] [tool] Migrate ChannelCommand to modular dependency injection (flutter/flutter#190751)
2026-09-01 [email protected] Add mouseCursor to RawScrollbar (flutter/flutter#185750)
2026-09-01 [email protected] Fix self-comparison and assert typos in TestSemantics (flutter/flutter#191938)
2026-09-01 [email protected] [Linux] Wait for frames to be rendered before using them in another context (flutter/flutter#192094)
2026-09-01 [email protected] [wimp] Turn on multithreading for wimp. (flutter/flutter#191747)
2026-09-01 [email protected] Roll Skia from 3911a1fe7f7a to 63d13ec4df6d (6 revisions) (flutter/flutter#192125)
2026-09-01 [email protected] Remove the redundant flutter/shell/platform/android:robolectric_tests build target (flutter/flutter#192117)
2026-09-01 [email protected] [iOS] Preserve semantics parents after reparenting (flutter/flutter#189686)
2026-09-01 [email protected] [flutter_tools] Report preview reload timing analytics in LspPreviewDetector (flutter/flutter#192120)
2026-09-01 [email protected] [flutter_tools] Implement Templates slice and flutter create integration (flutter/flutter#191748)
2026-09-01 [email protected] Uiscene migrate add2app hosts (flutter/flutter#191847)
2026-09-01 [email protected] Roll Packages from d642322 to 7a7912f (8 revisions) (flutter/flutter#192119)
2026-09-01 [email protected] [web] Anchor flt-semantics-host at 0,0 to fix WebKit semantics offset (flutter/flutter#190486)
2026-09-01 [email protected] Replace Shell::WaitForFirstFrame with an asynchronous API that matches the Shell threading model (flutter/flutter#191841)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages
Please CC [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
victorsanni pushed a commit to victorsanni/packages that referenced this pull request Sep 9, 2026
…r#12727)

flutter/flutter@0cbd1a4...70797e1

2026-09-02 [email protected] [analysis] Upgrade package:analyzer to 14.3.0 and enable custom plugin compilation (flutter/flutter#191590)
2026-09-02 [email protected] Roll Dart SDK from d8d7869d8031 to 9a8fbde80f6c (1 revision) (flutter/flutter#192179)
2026-09-02 [email protected] Roll Skia from dec311244db4 to ae22da2e8308 (1 revision) (flutter/flutter#192177)
2026-09-02 [email protected] [tool] Migrate DoctorCommand to modular dependency injection (flutter/flutter#190758)
2026-09-02 [email protected] Roll Skia from 482b7e285244 to dec311244db4 (3 revisions) (flutter/flutter#192161)
2026-09-02 [email protected] Roll Skia from 28447e9fb8d5 to 482b7e285244 (3 revisions) (flutter/flutter#192157)
2026-09-02 [email protected] feat: Add placeholder to DecorationImage (flutter/flutter#191528)
2026-09-02 [email protected] [Android] Do not schedule engine frames on a detached FlutterJNI (flutter/flutter#191204)
2026-09-02 [email protected] Roll Skia from 3a242fb7cdb3 to 28447e9fb8d5 (1 revision) (flutter/flutter#192145)
2026-09-02 [email protected] Roll Dart SDK from 9164def35347 to d8d7869d8031 (2 revisions) (flutter/flutter#192144)
2026-09-02 [email protected] Add FadeInImageTransition.fadeInOver to fade the image in over the placeholder (flutter/flutter#186246)
2026-09-02 [email protected] Roll Skia from 63d13ec4df6d to 3a242fb7cdb3 (9 revisions) (flutter/flutter#192138)
2026-09-02 [email protected] [flutter_tools] Add --no-plugins flag and disable plugins for benchmark (flutter/flutter#192129)
2026-09-02 [email protected] [tool] Migrate ChannelCommand to modular dependency injection (flutter/flutter#190751)
2026-09-01 [email protected] Add mouseCursor to RawScrollbar (flutter/flutter#185750)
2026-09-01 [email protected] Fix self-comparison and assert typos in TestSemantics (flutter/flutter#191938)
2026-09-01 [email protected] [Linux] Wait for frames to be rendered before using them in another context (flutter/flutter#192094)
2026-09-01 [email protected] [wimp] Turn on multithreading for wimp. (flutter/flutter#191747)
2026-09-01 [email protected] Roll Skia from 3911a1fe7f7a to 63d13ec4df6d (6 revisions) (flutter/flutter#192125)
2026-09-01 [email protected] Remove the redundant flutter/shell/platform/android:robolectric_tests build target (flutter/flutter#192117)
2026-09-01 [email protected] [iOS] Preserve semantics parents after reparenting (flutter/flutter#189686)
2026-09-01 [email protected] [flutter_tools] Report preview reload timing analytics in LspPreviewDetector (flutter/flutter#192120)
2026-09-01 [email protected] [flutter_tools] Implement Templates slice and flutter create integration (flutter/flutter#191748)
2026-09-01 [email protected] Uiscene migrate add2app hosts (flutter/flutter#191847)
2026-09-01 [email protected] Roll Packages from d642322 to 7a7912f (8 revisions) (flutter/flutter#192119)
2026-09-01 [email protected] [web] Anchor flt-semantics-host at 0,0 to fix WebKit semantics offset (flutter/flutter#190486)
2026-09-01 [email protected] Replace Shell::WaitForFirstFrame with an asynchronous API that matches the Shell threading model (flutter/flutter#191841)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages
Please CC [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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CICD Run CI/CD f: scrolling Viewports, list views, slivers, etc. framework flutter/packages/flutter repository. See also f: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants