-
Notifications
You must be signed in to change notification settings - Fork 29.7k
fix: SelectableText should handle focus changes #155771
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
fix: SelectableText should handle focus changes #155771
Conversation
aa001c5 to
a6dc254
Compare
justinmc
left a comment
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.
LGTM 👍
It seems a little weird that we have to check the lifecycle state when the focus changes, but if that's how Flutter's focus works then I guess that's what you have to do.
| // We should only clear the selection when this SelectableText loses | ||
| // focus while the application is currently running. It is possible | ||
| // that the application is not currently running, for example on desktop | ||
| // platforms, clicking on a different window switches the focus to | ||
| // the new window causing the Flutter application to go inactive. In this | ||
| // case we want to retain the selection so it remains when we return to | ||
| // the Flutter application. |
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.
So @gspencergoog when the application is backgrounded, any focused FocusNode loses focus? Just making sure that's how it works and is intended.
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.
For more context on this, as of #142930, the FocusManager responds to app lifecycle changes.
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 looks correct to me then, thanks for the context 👍
| await tester.pumpAndSettle(); | ||
| expect(controllerA.selection, TextRange.empty); | ||
| expect(controllerB.selection, const TextSelection.collapsed(offset: 0)); | ||
| }, variant: TargetPlatformVariant.all()); |
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.
Is it worth adding .all here instead of just omitting it? You do have a switch on the platform above, but maybe I think it doesn't affect this particular test.
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'm okay with either, but I usually lean towards .all if possible, and not platform specific, for more test coverage. What do you think?
| variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }), | ||
| variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }), |
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
|
I think you need to merge master into this branch to fix the Google test failure. |
a6dc254 to
6ea29fa
Compare
|
auto label is removed for flutter/flutter/155771, due to - The status or check suite Windows build_tests_2_7 has failed. Please fix the issues identified (or deflake) before re-applying this label. |
020592c to
be2d9d3
Compare
Manual roll requested by [email protected] flutter/flutter@fa402c8...ead6b0d 2024-09-27 [email protected] Remove left-over traces of "link-dry-run" - which isn't used anywhere in flutter (flutter/flutter#155820) 2024-09-27 [email protected] Roll Flutter Engine from e57b440ec4ee to 7c603de2dca7 (5 revisions) (flutter/flutter#155811) 2024-09-27 [email protected] Fix DropdownMenu rendered behind AppBar (flutter/flutter#155539) 2024-09-27 [email protected] Roll Flutter Engine from 53517772a5b0 to e57b440ec4ee (8 revisions) (flutter/flutter#155799) 2024-09-27 [email protected] Throw StateError when implicitView is null on `wrapWithDefaultView`. (flutter/flutter#155734) 2024-09-27 [email protected] Roll packages manually (flutter/flutter#155786) 2024-09-27 [email protected] fix: SelectableText should handle focus changes (flutter/flutter#155771) 2024-09-27 [email protected] Use flutter from in same repo (not path) in `generate_gradle_lockfiles.dart` (again) (flutter/flutter#155794) 2024-09-26 [email protected] Use flutter from in same repo (not path) in `generate_gradle_lockfiles.dart` (flutter/flutter#155790) 2024-09-26 [email protected] `RenderParagraph` should invalidate its `_SelectableFragment`s cached rects on window size updates (flutter/flutter#155719) 2024-09-26 [email protected] Fix broken text field with set hint and min and max lines(#153183) (flutter/flutter#153235) 2024-09-26 [email protected] Roll Flutter Engine from 9e6133e8d906 to 53517772a5b0 (1 revision) (flutter/flutter#155772) 2024-09-26 [email protected] Fix line-wrapping in `flutter create` error message. (flutter/flutter#150325) 2024-09-26 [email protected] remove fujino from CODEOWNERS (flutter/flutter#155369) 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],[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
This change updates the behavior of
SelectableText, to clear its selection when it loses focus and the application is currently running. This fixes the behavior where you may have multiple active highlights if you haveSelectableTextalong with other "selectable" widgets such asTextField, orTextwidgets under aSelectionArea.If the application is in the background, for example when another window is focused, the selection should be retained so when a user returns to the application it is still there.
This change also updates the behavior of selection on macOS, single tap up, previously it was selecting the word edge closest to the tapped position, the correct behavior on native is to select the precise position. This was causing
onSelectionChangedto be called twice, once for tap down (sets the precise tapped position, handled by logic inTextSelectionGestureDetector), and a second time for single tap up (moves the cursor to closest word edge, handled by logic in_SelectableTextSelectionGestureDetectorBuilder). This type of selection inconsistency is related to this issue #129726, I plan to look into this further in a separate PR.Fixes #117573
Fixes #103725
Pre-launch Checklist
///).