-
Notifications
You must be signed in to change notification settings - Fork 29.7k
[A11y] RangeSlider should have 2 focus node #172729
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This comment was marked as resolved.
This comment was marked as resolved.
| expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), disabledCursor); | ||
|
|
||
| await tester.pumpWidget(buildFrame(enabled: true)); | ||
| expect( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removing L2457-L2461 because I think this expect here was incorrect, it should never be SystemMouseCursors.none.
In previous code before my PR, if adding await tester.pumpAndSettle(); before L2457, the test will fail because it will become SystemMouseCursors.hovered.
| ) | ||
| final bool? year2023; | ||
|
|
||
| /// Focus node for the start thumb. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would be useful to document what these focus nodes can be used for. I imagine these exist so the parent widget could programmatically control the focus? It would also be useful to document what happens if these are left as null (e.g. that a default focus node will be created).
| /// Focus node for the start thumb. | ||
| final FocusNode? startFocusNode; | ||
|
|
||
| /// Focus node for the end thumb. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ditto
| Row( | ||
| children: <Widget>[ | ||
| Focus(focusNode: startFocusNode, child: const SizedBox.shrink()), | ||
| Focus(focusNode: endFocusNode, child: const SizedBox.shrink()), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This might be good enough for keyboard-based focus traversal. However, this may not be enough for mouse-based focus traversal. On the web it is expected that if I click on a thumb it acquires focus. So if I use the left/right arrow keys, the last thumb I clicked on reacts to the key.
One way to fix this is to position and size the children exactly to cover the thumbs, and hook up a click/tap listener that calls startFocusNode.requestFocus() or endFocusNode.requestFocus(), as appropriate.
That said, we can also treat it as a separate issue, and fix keyboard first, and mouse later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sounds good, i will treat it as a separate issue
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we have code to handle adjusting the slider with keyboard once the new focus nodes receive focus?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
good catch, we currently don't, we can adjust the slider in a11y mode. But when a11y mode is off, I didn't add the shortcut to the new focus nodes.
| child: result, | ||
| return Stack( | ||
| children: <Widget>[ | ||
| //Adds two invisible focus nodes to the range slider for its two thumbs. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: add one space between // and Adds.
| 'This feature was deprecated after v3.30.0-0.1.pre.', | ||
| ) | ||
| this.year2023, | ||
| this.startFocusNode, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to accept a focus node? Is there a use case where someone would want to pass in the focus node?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was trying to follow the practice of Slider and it has passed-in focus node.
I removed passed-in focus nodes and if they're needed in the future they can still be added.
| enableController.dispose(); | ||
| startPositionController.dispose(); | ||
| endPositionController.dispose(); | ||
| startFocusNode.dispose(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This can be passed-in focus node, in that case, we shouldn't dispose it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed passed-in focus node
| } else { | ||
| enableController.reverse(); | ||
| } | ||
| setState(() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
won't this crash in didUpdateWidget?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah you're right this should be simply "_showHoverHighlight = _hovering && isEnabled;"
| enableController.reverse(); | ||
| } | ||
| setState(() { | ||
| if (_showHoverHighlight != (_hovering && isEnabled)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this if check is redundant
| Row( | ||
| children: <Widget>[ | ||
| Focus(focusNode: startFocusNode, child: const SizedBox.shrink()), | ||
| Focus(focusNode: endFocusNode, child: const SizedBox.shrink()), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we have code to handle adjusting the slider with keyboard once the new focus nodes receive focus?
fix tests add highlight Update range_slider.dart
Roll Flutter from c3279caa127d to 871849e4b6bf (56 revisions) flutter/flutter@c3279ca...871849e 2025-08-01 [email protected] Roll Dart SDK from 6832e04cf2f9 to 6e1bb159c860 (8 revisions) (flutter/flutter#173119) 2025-08-01 [email protected] Add `--profile-startup` flag to `flutter run` (flutter/flutter#172990) 2025-08-01 [email protected] Add `side` to `RadioThemeData` (flutter/flutter#171945) 2025-08-01 [email protected] Update GCA instructions (flutter/flutter#173001) 2025-08-01 [email protected] [engine] Null aware elements clean-ups (flutter/flutter#173075) 2025-08-01 [email protected] Roll Packages from db6988d to f0645d8 (3 revisions) (flutter/flutter#173111) 2025-08-01 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Reland licenses cpp switch 3 (#173063)" (flutter/flutter#173113) 2025-08-01 [email protected] Update embedder API CODEOWNERS (flutter/flutter#173081) 2025-08-01 [email protected] Move android_obfuscate_test from devicelab into tools integration.shard (flutter/flutter#169798) 2025-08-01 [email protected] [A11y] RangeSlider should have 2 focus node (flutter/flutter#172729) 2025-07-31 [email protected] Upload the linux arm64 embedder to cloud buckets. (flutter/flutter#173068) 2025-07-31 [email protected] Reland licenses cpp switch 3 (flutter/flutter#173063) 2025-07-31 [email protected] [ Tool ] Mark IOOverrides subclasses as `final` (flutter/flutter#173078) 2025-07-31 [email protected] [macOS] Remove duplicate object initialization (flutter/flutter#171767) 2025-07-31 [email protected] Redistribute Android test owners (flutter/flutter#172886) 2025-07-31 [email protected] Avoid negatives in the styleguide.md (flutter/flutter#172917) 2025-07-31 [email protected] Roll Skia from 42e3bed42110 to 49e39cd3cf18 (7 revisions) (flutter/flutter#173069) 2025-07-31 [email protected] Fix the issue where calling showOnScreen on a sliver after a pinned child in SliverMainAxisGroup does not reveal it. (flutter/flutter#171339) 2025-07-31 [email protected] Improve assertion message in `EdgeInsetsDirectional.resolve` (flutter/flutter#172099) 2025-07-31 [email protected] licenses_cpp: Switched to lexically_relative for 2x speed boost. (flutter/flutter#173048) 2025-07-31 [email protected] Add dartvm to the dart_sdk_entitlement_config list. (flutter/flutter#173044) 2025-07-31 [email protected] [web] ClickDebouncer workaround for iOS Safari click behavior (flutter/flutter#172995) 2025-07-31 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Reland licenses cpp switch 2 (#172996)" (flutter/flutter#173059) 2025-07-31 [email protected] [web] Text editing test accepts both behaviors in Firefox (flutter/flutter#172767) 2025-07-31 [email protected] Reland licenses cpp switch 2 (flutter/flutter#172996) 2025-07-31 [email protected] Roll Packages from d914120 to db6988d (2 revisions) (flutter/flutter#173039) 2025-07-31 [email protected] Add a SliverList code sample (flutter/flutter#172986) 2025-07-31 [email protected] fix: adjust scrollable size assertion with tolerance (flutter/flutter#171426) 2025-07-31 [email protected] impeller: Shrink `Command` 40 bytes (flutter/flutter#173004) 2025-07-31 [email protected] [web] Remove outdated comment about HTML renderer (flutter/flutter#172877) 2025-07-31 [email protected] Roll Skia from ff4da49305c5 to 42e3bed42110 (1 revision) (flutter/flutter#173038) 2025-07-31 [email protected] Roll Skia from 7d468a4868cb to ff4da49305c5 (3 revisions) (flutter/flutter#173028) 2025-07-31 [email protected] Roll Skia from 951277895c86 to 7d468a4868cb (1 revision) (flutter/flutter#173027) 2025-07-31 [email protected] Manual roll of Dart from 14ea8d342149 to 6832e04cf2f9 (flutter/flutter#173015) 2025-07-31 [email protected] Roll Skia from 8bdf4cdcf4ed to 951277895c86 (2 revisions) (flutter/flutter#173022) 2025-07-31 [email protected] Roll Fuchsia Linux SDK from bQVQlLssTxxLjoDU0... to xo_bqOoFuBKFmgKxn... (flutter/flutter#173021) 2025-07-31 [email protected] feat: Add `cursorHeight` to `DropdownMenu` (flutter/flutter#172615) 2025-07-31 [email protected] Roll Skia from a3347cee2d73 to 8bdf4cdcf4ed (3 revisions) (flutter/flutter#173013) 2025-07-31 [email protected] [ Widget Preview ] Add `--web-server` support (flutter/flutter#172978) 2025-07-30 [email protected] Bump customer tests for zulip fix 2 (flutter/flutter#173003) 2025-07-30 [email protected] Migrate to null aware elements - Part 4 (flutter/flutter#172322) 2025-07-30 [email protected] Marks Linux linux_feature_flags_test to be unflaky (flutter/flutter#172629) 2025-07-30 [email protected] [ Widget Previews ] Add support for `MultiPreview`s (flutter/flutter#172852) 2025-07-30 [email protected] Made licenses_cpp simpatico with google licenses (flutter/flutter#172991) 2025-07-30 [email protected] Roll Skia from d579722d65c6 to a3347cee2d73 (6 revisions) (flutter/flutter#172989) 2025-07-30 [email protected] Migrate to null aware elements - Part 5 (flutter/flutter#172418) ...
internal: b/430179234 : in a11y mode, you can't use tab to focus on the handles of the rangeslider, only use a11y shortcut to focus on them. rangeSlider is a widget with 1 renderObject but 2 semanticsNode because it has 2 inputs, each handle of the rangeSlider has its own actions. To achieve that, rangeSlider creates its semantics node using the assembleSemantics function. For the same reason, rangeSlider should have 2 focus nodes instead of 1, and it should be linked to semantics to support tab to navigate in a11y mode. This PR is to add 2 focus nodes to the range slider, link them to a11y and also highlight the thumb when focused. ## Pre-launch Checklist - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ ] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] 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. - [ ] 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
internal: b/430179234 : in a11y mode, you can't use tab to focus on the handles of the rangeslider, only use a11y shortcut to focus on them. rangeSlider is a widget with 1 renderObject but 2 semanticsNode because it has 2 inputs, each handle of the rangeSlider has its own actions. To achieve that, rangeSlider creates its semantics node using the assembleSemantics function. For the same reason, rangeSlider should have 2 focus nodes instead of 1, and it should be linked to semantics to support tab to navigate in a11y mode. This PR is to add 2 focus nodes to the range slider, link them to a11y and also highlight the thumb when focused. ## Pre-launch Checklist - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ ] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] 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. - [ ] 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
internal: b/430179234 : in a11y mode, you can't use tab to focus on the handles of the rangeslider, only use a11y shortcut to focus on them. rangeSlider is a widget with 1 renderObject but 2 semanticsNode because it has 2 inputs, each handle of the rangeSlider has its own actions. To achieve that, rangeSlider creates its semantics node using the assembleSemantics function. For the same reason, rangeSlider should have 2 focus nodes instead of 1, and it should be linked to semantics to support tab to navigate in a11y mode. This PR is to add 2 focus nodes to the range slider, link them to a11y and also highlight the thumb when focused. ## Pre-launch Checklist - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ ] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] 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. - [ ] 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
internal: b/430179234 : in a11y mode, you can't use tab to focus on the handles of the rangeslider, only use a11y shortcut to focus on them. rangeSlider is a widget with 1 renderObject but 2 semanticsNode because it has 2 inputs, each handle of the rangeSlider has its own actions. To achieve that, rangeSlider creates its semantics node using the assembleSemantics function. For the same reason, rangeSlider should have 2 focus nodes instead of 1, and it should be linked to semantics to support tab to navigate in a11y mode. This PR is to add 2 focus nodes to the range slider, link them to a11y and also highlight the thumb when focused. ## Pre-launch Checklist - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ ] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] 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. - [ ] 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
internal: b/430179234 : in a11y mode, you can't use tab to focus on the handles of the rangeslider, only use a11y shortcut to focus on them. rangeSlider is a widget with 1 renderObject but 2 semanticsNode because it has 2 inputs, each handle of the rangeSlider has its own actions. To achieve that, rangeSlider creates its semantics node using the assembleSemantics function. For the same reason, rangeSlider should have 2 focus nodes instead of 1, and it should be linked to semantics to support tab to navigate in a11y mode. This PR is to add 2 focus nodes to the range slider, link them to a11y and also highlight the thumb when focused. ## Pre-launch Checklist - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ ] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] 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. - [ ] 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
internal: b/430179234 : in a11y mode, you can't use tab to focus on the handles of the rangeslider, only use a11y shortcut to focus on them.
rangeSlider is a widget with 1 renderObject but 2 semanticsNode because it has 2 inputs, each handle of the rangeSlider has its own actions. To achieve that, rangeSlider creates its semantics node using the assembleSemantics function.
For the same reason, rangeSlider should have 2 focus nodes instead of 1, and it should be linked to semantics to support tab to navigate in a11y mode.
This PR is to add 2 focus nodes to the range slider, link them to a11y and also highlight the thumb when focused.
Pre-launch Checklist
///).If you need help, consider asking for advice on the #hackers-new channel on Discord.