[A11y] RangeSlider should have 2 focus node#172729
[A11y] RangeSlider should have 2 focus node#172729auto-submit[bot] merged 11 commits intoflutter:masterfrom
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.
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.
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. |
| Row( | ||
| children: <Widget>[ | ||
| Focus(focusNode: startFocusNode, child: const SizedBox.shrink()), | ||
| Focus(focusNode: endFocusNode, child: const SizedBox.shrink()), |
There was a problem hiding this comment.
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.
sounds good, i will treat it as a separate issue
There was a problem hiding this comment.
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.
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.
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.
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.
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.
This can be passed-in focus node, in that case, we shouldn't dispose it
There was a problem hiding this comment.
removed passed-in focus node
| } else { | ||
| enableController.reverse(); | ||
| } | ||
| setState(() { |
There was a problem hiding this comment.
won't this crash in didUpdateWidget?
There was a problem hiding this comment.
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.
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.
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 c3279ca to 871849e (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.