Skip to content

[Material] Change default mouse cursor of buttons to basic arrow instead of click (except on web)#171796

Merged
auto-submit[bot] merged 97 commits intoflutter:masterfrom
camsim99:cursor_buttons
Oct 24, 2025
Merged

[Material] Change default mouse cursor of buttons to basic arrow instead of click (except on web)#171796
auto-submit[bot] merged 97 commits intoflutter:masterfrom
camsim99:cursor_buttons

Conversation

@camsim99
Copy link
Contributor

@camsim99 camsim99 commented Jul 8, 2025

Changes default mouse cursor of Material buttons to basic arrow instead of click as per updated Android guidance.

For each Material button, I did the following:

  1. Changed the default mouse cursor to the basic arrow.
  2. Added a way to configure the mouse cursor of the button if a method did not exist before.
  3. Added a test to ensure that the default mouse cursor is now the basic arrow (or modified an existing one if applicable).
  4. Added a test to ensure that the customization of button mouse cursors still works (if currently untested).

The list of Material buttons I modified (supposed to be all of them):

  • RawMaterialButton
  • DropdownButton
  • FloatingActionButton
  • ToggleButtons
  • ElevatedButton
  • IconButton
  • FilledButton
  • OutlinedButton
  • PopupMenuItem
  • InkWell
  • TextButton
  • MaterialButton
  • DropdownMenuItem
  • DropdownButtonFormField
  • BackButton
  • CloseButton
  • DrawerButton
  • EndDrawerButton
  • PopupMenuButton
  • MenuItemButton
  • CheckboxMenuButton
  • RadioMenuButton
  • MenuBar
  • SubmenuButton
  • SegmentedButton
  • FilterChip
  • ChoiceChip
  • ActionChip
  • InputChip

Fixes #170296.

Pre-launch Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@github-actions github-actions bot added a: text input Entering text in a text field or keyboard related problems framework flutter/packages/flutter repository. See also f: labels. f: material design flutter/packages/flutter/material repository. f: scrolling Viewports, list views, slivers, etc. labels Jul 8, 2025
@github-actions github-actions bot removed the f: scrolling Viewports, list views, slivers, etc. label Jul 8, 2025
Merged via the queue into flutter:master with commit 7fd228f Oct 24, 2025
154 of 155 checks passed
@flutter-dashboard flutter-dashboard bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Oct 24, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Oct 24, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Oct 24, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Oct 24, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Oct 24, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Oct 24, 2025
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Oct 24, 2025
Roll Flutter from 75004a6 to cb18290 (48 revisions)

flutter/flutter@75004a6...cb18290

2025-10-24 [email protected] Remove unnecessary `deprecated` withOpacity in `text_button.0.dart‎` in examples (flutter/flutter#177374)
2025-10-24 [email protected] Roll Packages from 9ec29b6 to 53d6138 (3 revisions) (flutter/flutter#177502)
2025-10-24 [email protected] Roll Dart SDK from d3248b00f545 to a0480f399f8f (1 revision) (flutter/flutter#177498)
2025-10-24 [email protected] Roll Skia from a47931d09585 to 3ed332b77bec (3 revisions) (flutter/flutter#177487)
2025-10-24 [email protected] Roll Abseil to Chromium's 5b92b04a2e (based on Abseil commit fc4481e968) (flutter/flutter#177059)
2025-10-24 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Reverts "Enhance PR template with changelog and impact details (#177333)" (#177468)" (flutter/flutter#177499)
2025-10-24 [email protected] Document DropdownMenu showTrailingIcon and decorationBuilder interaction (flutter/flutter#177488)
2025-10-24 [email protected] Roll Dart SDK from 4a65fb890852 to d3248b00f545 (1 revision) (flutter/flutter#177486)
2025-10-24 [email protected] Fix bottom sheet Semantics route label for mismatched platforms (flutter/flutter#177094)
2025-10-24 [email protected] Roll Skia from eba11de00d5b to a47931d09585 (5 revisions) (flutter/flutter#177481)
2025-10-24 [email protected] Fix Dialog Semantics label and flags for mismatched platforms (flutter/flutter#176781)
2025-10-24 [email protected] Fix drawer Semantics for mismatched platforms (flutter/flutter#177095)
2025-10-24 [email protected] Roll Dart SDK from f7751ccea102 to 4a65fb890852 (2 revisions) (flutter/flutter#177480)
2025-10-23 [email protected] Change the root path of the license crawl to engine/src (flutter/flutter#177352)
2025-10-23 [email protected] [Material] Change default mouse cursor of buttons to basic arrow instead of click (except on web) (flutter/flutter#171796)
2025-10-23 [email protected] [Desktop] Propagate SemanticsNode::identifier to AXPlatformNodeDelegate::AuthorUniqueId (flutter/flutter#175405)
2025-10-23 [email protected] Roll Skia from 59ef57f4104e to eba11de00d5b (5 revisions) (flutter/flutter#177461)
2025-10-23 [email protected] Roll customer tests (flutter/flutter#177409)
2025-10-23 [email protected] Update CHANGELOG 3.35.7 notes (flutter/flutter#177463)
2025-10-23 [email protected] Marks Mac module_uiscene_test_ios to be unflaky (flutter/flutter#177378)
2025-10-23 [email protected] Allow empty dart defines in `flutter assemble` (flutter/flutter#177198)
2025-10-23 [email protected] Roll Packages from d113bbc to 9ec29b6 (12 revisions) (flutter/flutter#177455)
2025-10-23 [email protected] Implements engine-side declarative pointer event handling for semantics. (flutter/flutter#176974)
2025-10-23 [email protected] Fix the platform name of the windowing_test target for macOS in ci.yaml (flutter/flutter#177472)
2025-10-23 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Enhance PR template with changelog and impact details (#177333)" (flutter/flutter#177468)
2025-10-23 [email protected] Change Flutter APIs to use spans (flutter/flutter#177272)
2025-10-23 [email protected] Roll Dart SDK from 020988602772 to f7751ccea102 (4 revisions) (flutter/flutter#177449)
2025-10-23 [email protected] [macOS] Implement regular window (flutter/flutter#176361)
2025-10-23 [email protected] Enhance PR template with changelog and impact details (flutter/flutter#177333)
2025-10-23 [email protected] Roll Skia from 6e6acf6644ef to 59ef57f4104e (2 revisions) (flutter/flutter#177436)
2025-10-23 [email protected] Add directional static members to AlignmentGeometry. (flutter/flutter#176571)
2025-10-23 [email protected] Roll ICU from 1b2e3e8a421e to ff35c4f9df23 (5 revisions) (flutter/flutter#177434)
2025-10-23 [email protected] Adds a new CI build for Linux host DDM-enabled artifacts (flutter/flutter#177252)
2025-10-23 [email protected] Roll Skia from 920cdcadd74c to 6e6acf6644ef (1 revision) (flutter/flutter#177432)
2025-10-23 [email protected] Roll Skia from 8cd449e4953b to 920cdcadd74c (6 revisions) (flutter/flutter#177426)
2025-10-23 [email protected] Added ahem license (flutter/flutter#177423)
2025-10-23 [email protected] Roll Dart SDK from 75f6ccb9bdc5 to 020988602772 (1 revision) (flutter/flutter#177421)
2025-10-23 [email protected] [web] Set `pointer-events: none` for img-element-backed images (flutter/flutter#177418)
2025-10-22 [email protected] Remove the x64 version of build_ios_framework_module_test (flutter/flutter#177136)
2025-10-22 [email protected] Fix accessibility events not being correctly translated to ATK (flutter/flutter#176991)
2025-10-22 [email protected] Roll Skia from b55bd60ed95b to 8cd449e4953b (8 revisions) (flutter/flutter#177405)
2025-10-22 [email protected] Roll Dart SDK from c23010c4f9e6 to 75f6ccb9bdc5 (4 revisions) (flutter/flutter#177399)
2025-10-22 [email protected] Fixes crash when adding and removing mulitple page-based route (flutter/flutter#177338)
2025-10-22 [email protected] Move child parameter to end of RefreshIndicator constructor (flutter/flutter#177019)
2025-10-22 [email protected] refactor: migrate OpenUpwardsPageTransitionsBuilder to widgets (flutter/flutter#177080)
2025-10-22 [email protected] Delete stray 'text' file (flutter/flutter#177355)
...
reidbaker pushed a commit to AbdeMohlbi/flutter that referenced this pull request Dec 10, 2025
…ead of click (except on web) (flutter#171796)

Changes default mouse cursor of Material buttons to basic arrow instead
of click as per updated Android guidance.

For each Material button, I did the following:

1. Changed the default mouse cursor to the basic arrow.
2. Added a way to configure the mouse cursor of the button if a method
did not exist before.
3. Added a test to ensure that the default mouse cursor is now the basic
arrow (or modified an existing one if applicable).
4. Added a test to ensure that the customization of button mouse cursors
still works (if currently untested).

The list of Material buttons I modified (supposed to be all of them):

- RawMaterialButton
- DropdownButton
- FloatingActionButton
- ToggleButtons
- ElevatedButton
- IconButton
- FilledButton
- OutlinedButton
- PopupMenuItem
- InkWell
- TextButton
- MaterialButton
- DropdownMenuItem
- DropdownButtonFormField
- BackButton
- CloseButton
- DrawerButton
- EndDrawerButton
- PopupMenuButton
- MenuItemButton
- CheckboxMenuButton
- RadioMenuButton
- MenuBar
- SubmenuButton
- SegmentedButton
- FilterChip
- ChoiceChip
- ActionChip
- InputChip

Fixes flutter#170296.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [ ] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md

---------

Co-authored-by: Tong Mu <[email protected]>
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 11, 2026
@pagetronic
Copy link

The directive is for Android, but here it applies to all platforms.

@camsim99
Copy link
Contributor Author

The directive is for Android, but here it applies to all platforms.

This is working as intended; this change modifies the default behavior of all Material buttons on all platforms except web.

@pagetronic
Copy link

The directive is for Android, but here it applies to all platforms.

This is working as intended; this change modifies the default behavior of all Material buttons on all platforms except web.

This was expected in response to the "Android guidance," not for Linux/Windows/MacOS.

@camsim99
Copy link
Contributor Author

This was expected in response to the "Android guidance," not for Linux/Windows/MacOS.

True, this change was based on Android's guidance for large screens though it does not explicitly state other platforms. My understanding, though, is that Flutter's Material components follow Android's guidelines across platforms (except web in this case because we found explicit guidance stating otherwise). That's why this change was made cross-platform.

However, if this is causing any pain, please feel free to file an issue so we can discuss there. I'm happy to reevaluate if there is opposing guidance!

@VinsonGuo
Copy link

Hi @camsim99 ,Is there an option to change the adaptiveClickable? For example, is it possible to change _adaptiveClickable from SystemMouseCursors.basic to SystemMouseCursors.click on desktop and web?

  /// A platform-adaptive mouse cursor for clickable widgets, which resolves
  /// differently based on the widget's state and the platform.
  ///
  /// On web platforms, this cursor resolves to [SystemMouseCursors.click] by
  /// default. If the widget is disabled, it resolves to
  /// [SystemMouseCursors.basic].
  ///
  /// On non-web platforms, this cursor always resolves to
  /// [SystemMouseCursors.basic].
  ///
  /// This cursor is commonly used for interactive widgets like buttons. The
  /// difference in behavior across platforms reflects native conventions (e.g.,
  /// web uses a hand pointer for buttons, while desktop platforms do not).
  static const WidgetStateMouseCursor adaptiveClickable = WidgetStateMouseCursor.resolveWith(
    _adaptiveClickable,
    debugDescription: 'WidgetStateMouseCursor(adaptiveClickable)',
  );

  static MouseCursor _adaptiveClickable(Set<WidgetState> states) {
    if (states.contains(WidgetState.disabled)) {
      return SystemMouseCursors.basic;
    }
    return kIsWeb ? SystemMouseCursors.click : SystemMouseCursors.basic;

@pagetronic
Copy link

Okay, but at a minimum, this should be configurable in the theme; here it is arbitrary and we cannot override the InkWell.

@VinsonGuo
Copy link

@pagetronic sure, I gave it a try. Not only the inkwell, but also the drop-down button, navigation rail, chip couldn't be configured in the theme. I'm also curious whether Chromebooks or Android tablets with a mouse cursor work properly. Since I don't have such devices, I can't verify that.

@pagetronic
Copy link

pagetronic commented Feb 19, 2026

I suggest these changes, which preserve previous modifications while offering the possibility of modifying them via ThemeData.

 ThemeData(
        iconButtonTheme: IconButtonThemeData(style: ButtonStyle(mouseCursor: WidgetStateProperty.all(SystemMouseCursors.click))),
        textButtonTheme: TextButtonThemeData(style: ButtonStyle(mouseCursor: WidgetStateProperty.all(SystemMouseCursors.click))),
        popupMenuTheme: PopupMenuThemeData(mouseCursor: WidgetStateProperty.all(SystemMouseCursors.click)),
      )

#182652

@camsim99
Copy link
Contributor Author

Thank you both for digging into some alternative solutions here! Please feel free to open an issue and/or pull request so we can review your proposed changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a: text input Entering text in a text field or keyboard related problems d: api docs Issues with https://api.flutter.dev/ d: examples Sample code and demos f: material design flutter/packages/flutter/material repository. framework flutter/packages/flutter repository. See also f: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] Consider showing an arrow cursor when hovering over buttons with mouse

6 participants