Skip to content

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
@camsim99
Copy link
Contributor Author

Fixed comments to reference WidgetStateMouseCursor.adaptiveClickable and removed unnecessary fallbackCursor variables.

Copy link
Contributor

@dkwingsmt dkwingsmt left a comment

Choose a reason for hiding this comment

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

I read through again and there are some final comments. Otherwise looking good.

side: BorderSide(color: colorScheme.onSurface.withOpacity(0.12)),
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4))),
enabledMouseCursor: SystemMouseCursors.click,
enabledMouseCursor: WidgetStateMouseCursor.adaptiveClickable,
Copy link
Contributor

Choose a reason for hiding this comment

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

Technically this can be simplified to enabledMouseCursor: kIsWeb ? SystemMouseCursors.click : SystemMouseCursors.basic, isn't it?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I need some clarity here because we've full circle in the review process; I had this before but I thought you suggested we reference adaptive clickable instead (e.g. #171796 (comment)).

In fact, I just changed both the disabled and enabled mouse cursor for default button styles to WidgetStateMouseCursor.adaptiveClickable (part of whose purpose was to get rid of the kIsWeb checks everywhere) to address #171796 (comment). I realize those comments were about the documentation itself but it wouldn’t make sense to me to reference a different value in the documentation than what we set for the actual disabled and enabled mouse cursors in the code.

To me, bringing back the kIsWeb check version looks less simplified. However, I defer to you on what you prefer here. Just let me know.

Copy link
Contributor

@dkwingsmt dkwingsmt Oct 21, 2025

Choose a reason for hiding this comment

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

Oh they're referring to different things.

For documentation, we use [WidgetStateMouseCursor.adaptiveClickable] because the doc for [WidgetStateMouseCursor.adaptiveClickable] has explained everything pretty clearly and we shouldn't bother repeating ourselves again anywhere if possible.

For implementation, since this specific value is only for the enabled cursor, it's not needed to resolve the value again, and instead we can resolve it manually by providing the SystemMouseCursor. (I'm not strong on this. The current way of using WidgetStateMouseCursor.adaptiveClickable is easier to maintain and understand, and therefore makes sense too.)

Let me know if you still find something unclear. And thanks for asking!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ah gotcha understood. SGTM! I'm pro not having the value resolve twice so I'll make the change.

@camsim99 camsim99 requested a review from dkwingsmt October 22, 2025 16:20
Copy link
Contributor

@dkwingsmt dkwingsmt left a comment

Choose a reason for hiding this comment

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

LGTM. Thank you!

Co-authored-by: Tong Mu <dkwingsmt@users.noreply.github.com>
@camsim99 camsim99 added the autosubmit Merge PR when tree becomes green via auto submit App label Oct 23, 2025
@auto-submit auto-submit bot added this pull request to the merge queue Oct 23, 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 116356835+AbdeMohlbi@users.noreply.github.com Remove unnecessary `deprecated` withOpacity in `text_button.0.dart‎` in examples (flutter/flutter#177374)
2025-10-24 engine-flutter-autoroll@skia.org Roll Packages from 9ec29b6 to 53d6138 (3 revisions) (flutter/flutter#177502)
2025-10-24 engine-flutter-autoroll@skia.org Roll Dart SDK from d3248b00f545 to a0480f399f8f (1 revision) (flutter/flutter#177498)
2025-10-24 engine-flutter-autoroll@skia.org Roll Skia from a47931d09585 to 3ed332b77bec (3 revisions) (flutter/flutter#177487)
2025-10-24 jason-simmons@users.noreply.github.com 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 bruno.leroux@gmail.com Document DropdownMenu showTrailingIcon and decorationBuilder interaction (flutter/flutter#177488)
2025-10-24 engine-flutter-autoroll@skia.org Roll Dart SDK from 4a65fb890852 to d3248b00f545 (1 revision) (flutter/flutter#177486)
2025-10-24 huy@nevercode.io Fix bottom sheet Semantics route label for mismatched platforms (flutter/flutter#177094)
2025-10-24 engine-flutter-autoroll@skia.org Roll Skia from eba11de00d5b to a47931d09585 (5 revisions) (flutter/flutter#177481)
2025-10-24 huy@nevercode.io Fix Dialog Semantics label and flags for mismatched platforms (flutter/flutter#176781)
2025-10-24 huy@nevercode.io Fix drawer Semantics for mismatched platforms (flutter/flutter#177095)
2025-10-24 engine-flutter-autoroll@skia.org Roll Dart SDK from f7751ccea102 to 4a65fb890852 (2 revisions) (flutter/flutter#177480)
2025-10-23 jason-simmons@users.noreply.github.com Change the root path of the license crawl to engine/src (flutter/flutter#177352)
2025-10-23 43054281+camsim99@users.noreply.github.com [Material] Change default mouse cursor of buttons to basic arrow instead of click (except on web) (flutter/flutter#171796)
2025-10-23 loic.peron@inetum.com [Desktop] Propagate SemanticsNode::identifier to AXPlatformNodeDelegate::AuthorUniqueId (flutter/flutter#175405)
2025-10-23 engine-flutter-autoroll@skia.org Roll Skia from 59ef57f4104e to eba11de00d5b (5 revisions) (flutter/flutter#177461)
2025-10-23 737941+loic-sharma@users.noreply.github.com Roll customer tests (flutter/flutter#177409)
2025-10-23 1063596+reidbaker@users.noreply.github.com Update CHANGELOG 3.35.7 notes (flutter/flutter#177463)
2025-10-23 fluttergithubbot@gmail.com Marks Mac module_uiscene_test_ios to be unflaky (flutter/flutter#177378)
2025-10-23 31859944+LongCatIsLooong@users.noreply.github.com Allow empty dart defines in `flutter assemble` (flutter/flutter#177198)
2025-10-23 engine-flutter-autoroll@skia.org Roll Packages from d113bbc to 9ec29b6 (12 revisions) (flutter/flutter#177455)
2025-10-23 zhongliu88889@gmail.com Implements engine-side declarative pointer event handling for semantics. (flutter/flutter#176974)
2025-10-23 jason-simmons@users.noreply.github.com 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 kjlubick@users.noreply.github.com Change Flutter APIs to use spans (flutter/flutter#177272)
2025-10-23 engine-flutter-autoroll@skia.org Roll Dart SDK from 020988602772 to f7751ccea102 (4 revisions) (flutter/flutter#177449)
2025-10-23 matej.knopp@gmail.com [macOS] Implement regular window (flutter/flutter#176361)
2025-10-23 1063596+reidbaker@users.noreply.github.com Enhance PR template with changelog and impact details (flutter/flutter#177333)
2025-10-23 engine-flutter-autoroll@skia.org Roll Skia from 6e6acf6644ef to 59ef57f4104e (2 revisions) (flutter/flutter#177436)
2025-10-23 sokolovskyi.konstantin@gmail.com Add directional static members to AlignmentGeometry. (flutter/flutter#176571)
2025-10-23 engine-flutter-autoroll@skia.org Roll ICU from 1b2e3e8a421e to ff35c4f9df23 (5 revisions) (flutter/flutter#177434)
2025-10-23 goderbauer@google.com Adds a new CI build for Linux host DDM-enabled artifacts (flutter/flutter#177252)
2025-10-23 engine-flutter-autoroll@skia.org Roll Skia from 920cdcadd74c to 6e6acf6644ef (1 revision) (flutter/flutter#177432)
2025-10-23 engine-flutter-autoroll@skia.org Roll Skia from 8cd449e4953b to 920cdcadd74c (6 revisions) (flutter/flutter#177426)
2025-10-23 30870216+gaaclarke@users.noreply.github.com Added ahem license (flutter/flutter#177423)
2025-10-23 engine-flutter-autoroll@skia.org Roll Dart SDK from 75f6ccb9bdc5 to 020988602772 (1 revision) (flutter/flutter#177421)
2025-10-23 1961493+harryterkelsen@users.noreply.github.com [web] Set `pointer-events: none` for img-element-backed images (flutter/flutter#177418)
2025-10-22 jason-simmons@users.noreply.github.com Remove the x64 version of build_ios_framework_module_test (flutter/flutter#177136)
2025-10-22 robert.ancell@canonical.com Fix accessibility events not being correctly translated to ATK (flutter/flutter#176991)
2025-10-22 engine-flutter-autoroll@skia.org Roll Skia from b55bd60ed95b to 8cd449e4953b (8 revisions) (flutter/flutter#177405)
2025-10-22 engine-flutter-autoroll@skia.org Roll Dart SDK from c23010c4f9e6 to 75f6ccb9bdc5 (4 revisions) (flutter/flutter#177399)
2025-10-22 47866232+chunhtai@users.noreply.github.com Fixes crash when adding and removing mulitple page-based route (flutter/flutter#177338)
2025-10-22 61709763+cuteUtya@users.noreply.github.com Move child parameter to end of RefreshIndicator constructor (flutter/flutter#177019)
2025-10-22 34465683+rkishan516@users.noreply.github.com refactor: migrate OpenUpwardsPageTransitionsBuilder to widgets (flutter/flutter#177080)
2025-10-22 1961493+harryterkelsen@users.noreply.github.com 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 <dkwingsmt@users.noreply.github.com>
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

4 participants