-
Notifications
You must be signed in to change notification settings - Fork 29.8k
The initial/selected item on popup menu should always be visible #143118
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
HansMuller
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
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 not sure what the distinction between this and SchedulerBinding.instance.addPostFrameCallback is. Most of our code appears to use the SchedulerBinding version.
Fixes #142896 The original code below is to always place the selected item above(overlap) the popup button so that the selected item can always be visible: https://github.com/flutter/flutter/blob/f8a77225f360556322934a9a831ffc9c9f3125da/packages/flutter/lib/src/material/popup_menu.dart#L723-L732 But when menu height is constrained and the menu itself is super long, the selected item still assumes there is enough space to push up all the items whose index is smaller than the selected index. As a result, every time when the menu is open, the calculation provides a different result to be the offset for the selected index, and then with a constrained height, the menu looks jumping all over the place based on the different selected index. https://github.com/flutter/flutter/assets/36861262/ad761f95-0ff5-4311-a81d-dac56df879c5 Even though the original calculation is to make the selected item visible when open the menu, the menu doesn't auto scroll and only expands itself as much as possible to show the selected one. In this case, if the screen it too small to show the selected item, we still cannot see it. This can be fixed by using `Scrollable.ensureVisible()`(#143118). So we remove the calculation in this PR and the menu will always show up based on the top left of the anchor(button). https://github.com/flutter/flutter/assets/36861262/03272f26-9440-4ac4-a701-9a0b41776ff9
de0270b to
6c11f84
Compare
931db17 to
d49217a
Compare
tvolkert
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.
Does this keep the behavior that the selected item will appear over the button when a PopupMenuButton is used?
|
|
||
| final RelativeRect position; | ||
| final List<PopupMenuEntry<T>> items; | ||
| final List<GlobalKey>? itemKeys; |
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.
Are there any other users of _PopupMenuRoute? If not, this doesn't need to be nullable.
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.
You are right. Thanks for catching this! Updating.
| semanticLabel ??= MaterialLocalizations.of(context).popupMenuLabel; | ||
| } | ||
|
|
||
| final List<GlobalKey> menuItemKeys = itemKeys ?? List<GlobalKey>.generate(items.length, (int index) => GlobalKey()); |
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.
If we create global keys here, don't we need to dispose them?
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.
Weird - I thought you needed to dispose GlobalKeys, but it looks like I'm wrong - please disregard 🙂
| required BuildContext context, | ||
| required RelativeRect position, | ||
| required List<PopupMenuEntry<T>> items, | ||
| List<GlobalKey>? itemKeys, |
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.
What's the use case for exposing these in the API?
If we do expose them, please cover them in the dart docs above.
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.
Oh sorry, I think we don't have to expose this. I used it to do some experiments but forgot to clean it up! Updating.
|
auto label is removed for flutter/flutter/143118, due to This PR has not met approval requirements for merging. Changes were requested by {tvolkert}, please make the needed changes and resubmit this PR.
|
Yes, the selected item will still appear over the button but the menu position would be different. With this PR's change, the selected item will always on the top of the menu and the menu is aligned with the button. The difference is the top of the menu is always the same as the button top unless there is not enough space for menu, then the menu would try to show as much as contents like the original way. I used the same demo👇 as the one shown in previous PR comment video demoScreen.Recording.2024-02-07.at.3.55.58.PM.mov |
| final _PopupMenuRoute<T> route; | ||
| final String? semanticLabel; | ||
| final BoxConstraints? constraints; | ||
| final List<GlobalKey>? itemKeys; |
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.
Looks like this can be non-nullable now too?
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.
Yes, just updated. Thanks!!
tvolkert
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 - thanks!
Roll Flutter from a628814 to d7867ca (66 revisions) flutter/flutter@a628814...d7867ca 2024-02-16 engine-flutter-autoroll@skia.org Roll Packages from ef349be to c56c12d (5 revisions) (flutter/flutter#143581) 2024-02-16 tessertaha@gmail.com Update `MaterialStatesController` docs for calling `setState` in a listener (flutter/flutter#143453) 2024-02-16 tessertaha@gmail.com Update `DataTable` docs for disabled `DataRow` ink well (flutter/flutter#143450) 2024-02-16 engine-flutter-autoroll@skia.org Roll Flutter Engine from b7103bc8b374 to dd530f1556df (17 revisions) (flutter/flutter#143565) 2024-02-16 jason-simmons@users.noreply.github.com Manual roll Flutter Engine from b7103bc8b374 to 7de84271eb65 (flutter/flutter#143564) 2024-02-16 jason-simmons@users.noreply.github.com Manual roll Flutter Engine from d3c71d78f8ef to df0dc1fc06ca (flutter/flutter#143563) 2024-02-16 jason-simmons@users.noreply.github.com Manual roll Flutter Engine from bc4dd534a0fa to d3c71d78f8ef (flutter/flutter#143561) 2024-02-16 jason-simmons@users.noreply.github.com Manual roll Flutter Engine from edb2745e9834 to bc4dd534a0fa (flutter/flutter#143559) 2024-02-16 jason-simmons@users.noreply.github.com Manual roll Flutter Engine from 15a358bbaf71 to edb2745e9834 (flutter/flutter#143555) 2024-02-16 jonahwilliams@google.com [devicelab] retain prior events for flutter gallery. (flutter/flutter#143554) 2024-02-16 kustermann@google.com Reland "Disentangle and align flutter build web --wasm flags (#143517)" (flutter/flutter#143549) 2024-02-16 engine-flutter-autoroll@skia.org Roll Flutter Engine from 3af336bfb2df to 15a358bbaf71 (1 revision) (flutter/flutter#143428) 2024-02-15 barpac02@gmail.com Android Gradle file templates: make it easier to convert them to Kotlin DSL in the future (flutter/flutter#142146) 2024-02-15 godofredoc@google.com Remove bringup from win arm64 builds. (flutter/flutter#143548) 2024-02-15 jawscout@gmail.com Fix minor spelling error (flutter/flutter#143541) 2024-02-15 jonahwilliams@google.com [devicelab] migrate new gallery benchmarks to local copy. (flutter/flutter#143545) 2024-02-15 49699333+dependabot[bot]@users.noreply.github.com Bump github/codeql-action from 3.24.1 to 3.24.3 (flutter/flutter#143546) 2024-02-15 danny@tuppeny.com [flutter_tool] [dap] Forward Flutter progress events to DAP client (flutter/flutter#142524) 2024-02-15 matanlurey@users.noreply.github.com Swap the tasks that have been running fine for a while. (flutter/flutter#143544) 2024-02-15 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Disentangle and align `flutter build web --wasm` flags (#143517)" (flutter/flutter#143547) 2024-02-15 katelovett@google.com Reland simulatedAccessibilityTraversal fix (flutter/flutter#143527) 2024-02-15 kustermann@google.com Disentangle and align `flutter build web --wasm` flags (flutter/flutter#143517) 2024-02-15 jonahwilliams@google.com [devicelab] introduce new old gallery. (flutter/flutter#143486) 2024-02-15 godofredoc@google.com Remove certs dependency. (flutter/flutter#143495) 2024-02-15 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Fix and test SemanticsController.simulatedAccessibilityTraversal (#143386)" (flutter/flutter#143523) 2024-02-15 engine-flutter-autoroll@skia.org Roll Packages from a864254 to ef349be (9 revisions) (flutter/flutter#143521) 2024-02-15 u.hossein@yahoo.com Modify `plugin_ffi` and `package_ffi` template (flutter/flutter#143376) 2024-02-15 godofredoc@google.com Remove certs installation from win_arm builds. (flutter/flutter#143487) 2024-02-14 98614782+auto-submit[bot]@users.noreply.github.com Reverts "[a11y] Add isEnabled semantics flag to text field (#143334)" (flutter/flutter#143494) 2024-02-14 98614782+auto-submit[bot]@users.noreply.github.com Reverts "[a11y] Fix date picker cannot focus on the edit field (#143117)" (flutter/flutter#143493) 2024-02-14 jhy03261997@gmail.com [a11y] Fix date picker cannot focus on the edit field (flutter/flutter#143117) 2024-02-14 goderbauer@google.com cleanup now-irrelevant ignores for `deprecated_member_use` (flutter/flutter#143403) 2024-02-14 katelovett@google.com Fix and test SemanticsController.simulatedAccessibilityTraversal (flutter/flutter#143386) 2024-02-14 goderbauer@google.com Disable deprecation warnings for mega_gallery (flutter/flutter#143466) 2024-02-14 36861262+QuncCccccc@users.noreply.github.com The initial/selected item on popup menu should always be visible (flutter/flutter#143118) 2024-02-14 dacoharkes@google.com Roll native_assets_builder to 0.5.0 (flutter/flutter#143472) 2024-02-14 leroux_bruno@yahoo.fr InputDecorator M3 test migration step2 (flutter/flutter#143369) 2024-02-14 leroux_bruno@yahoo.fr Add more documentation for TextEditingController default constructor (flutter/flutter#143452) 2024-02-14 34871572+gmackall@users.noreply.github.com Format all kotlin according to ktlint (flutter/flutter#143390) 2024-02-14 fluttergithubbot@gmail.com Marks Linux_pixel_7pro integration_ui_keyboard_resize to be unflaky (flutter/flutter#143440) 2024-02-14 engine-flutter-autoroll@skia.org Roll Packages from 9385bbb to a864254 (6 revisions) (flutter/flutter#143454) 2024-02-14 65850618+Anas35@users.noreply.github.com [tools] Add column header for emulators information (flutter/flutter#142853) 2024-02-14 kustermann@google.com Use `dart compile wasm` for wasm compilations (flutter/flutter#143298) 2024-02-14 jonahwilliams@google.com [devicelab] retain first frame data in certain integration tests. (flutter/flutter#143419) 2024-02-14 engine-flutter-autoroll@skia.org Roll Flutter Engine from 0849250a1419 to 3af336bfb2df (2 revisions) (flutter/flutter#143427) 2024-02-14 engine-flutter-autoroll@skia.org Roll Flutter Engine from 215d55f4f82d to 0849250a1419 (2 revisions) (flutter/flutter#143425) ...
Fixes #142895
With the change of #143121, this PR is to add auto scroll to
PopupMenuButtonso when we open the menu, it will automatically scroll to the selected item.auto_scroll_fix.mov
Pre-launch Checklist
///).