Skip to content

Conversation

@QuncCccccc
Copy link
Contributor

@QuncCccccc QuncCccccc commented Jun 28, 2023

Fixes #120349

This PR enables DropdownMenu to automatically scroll to the first matching item when enableSearch is true.

video example
pr_video.mov

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].
  • All existing and new tests are passing.

@QuncCccccc QuncCccccc force-pushed the ensure_visible_dropdown_menu branch from c0f5989 to 5885da8 Compare June 28, 2023 20:45
@QuncCccccc QuncCccccc marked this pull request as ready for review June 29, 2023 06:39
@QuncCccccc QuncCccccc requested a review from HansMuller June 29, 2023 06:41
Copy link
Contributor

@HansMuller HansMuller left a comment

Choose a reason for hiding this comment

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

Looks good, just some questions about the details.


if (widget.enableSearch) {
currentHighlight = search(filteredEntries, _textEditingController);
scrollToHighlight();
Copy link
Contributor

Choose a reason for hiding this comment

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

If currentHighlight is null should we still call scrollToHighlight()?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

No, I should add a null check here. Thanks for catching this! Just updated.

void didUpdateWidget(DropdownMenu<T> oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.dropdownMenuEntries != widget.dropdownMenuEntries) {
filteredEntries = widget.dropdownMenuEntries;
Copy link
Contributor

Choose a reason for hiding this comment

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

Should currentHighlight be set to null here?

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 yes, and I think I need to add a if statement to check oldWidget.enableSearch != widget.enableSearch so that if widget.enableSearch is updated to false, currentHighlight should also be updated. Just updated.

if (oldWidget.enableSearch != widget.enableSearch) {
  if (!widget.enableSearch) {
    currentHighlight = null;
  }
}


void scrollToHighlight() {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (currentHighlight != null && buttonItemKeys[currentHighlight!].currentContext != null) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Is it possible to get here if currentHighlight is null? If so, we should test that case.

It would be nice to write this with only one lookup of the current highlight's context. Like

  void scrollToHighlight() {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (currentHighlight == null) {
        return;
      }
      final BuildContext? highlightContext = buttonItemKeys[currentHighlight!].currentContext;
      if (highlightContext != null) {
        Scrollable.ensureVisible(highlightContext);
      );
    }
  }

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 think the currentHighlight will not be null here because it is checked before calling scrollToHighlight(), so just removed it in this method.

@QuncCccccc QuncCccccc force-pushed the ensure_visible_dropdown_menu branch from 600e7ba to d199498 Compare June 29, 2023 21:00
Copy link
Contributor

@HansMuller HansMuller left a comment

Choose a reason for hiding this comment

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

LGTM

@QuncCccccc QuncCccccc force-pushed the ensure_visible_dropdown_menu branch from d199498 to 58fae51 Compare June 30, 2023 00:43
@github-actions github-actions bot added framework flutter/packages/flutter repository. See also f: labels. f: material design flutter/packages/flutter/material repository. labels Jun 30, 2023
@QuncCccccc QuncCccccc added the autosubmit Merge PR when tree becomes green via auto submit App label Jun 30, 2023
@auto-submit auto-submit bot merged commit 91cb261 into master Jun 30, 2023
@auto-submit auto-submit bot deleted the ensure_visible_dropdown_menu branch June 30, 2023 01:48
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jul 1, 2023
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Jul 1, 2023
flutter/flutter@ff838bc...aa5f4a2

2023-07-01 [email protected] Enable no_wildcard_variable_uses lint (flutter/flutter#129858)
2023-06-30 [email protected] mark packages-autoroller bringup again (flutter/flutter#129859)
2023-06-30 [email protected] Update `SwitchTheme` tests for M2/M3 (flutter/flutter#129811)
2023-06-30 [email protected] Change pub roller bot to push to flutter-pub-roller-bot/flutter.git (flutter/flutter#129844)
2023-06-30 [email protected] Fix NetworkImage causing spurious warning in tests (flutter/flutter#129537)
2023-06-30 [email protected] Roll Flutter Engine from 54b573e9c4e5 to e6b8292705a8 (4 revisions) (flutter/flutter#129852)
2023-06-30 [email protected] Upgrade integration tests to use AGP 7.3/Gradle 7.4 (flutter/flutter#129642)
2023-06-30 [email protected] Roll Packages from d4752c4 to 53ed5a0 (5 revisions) (flutter/flutter#129837)
2023-06-30 [email protected] Updated correct tasks for test ownership fix (flutter/flutter#129812)
2023-06-30 [email protected] Updated some golden image tests for M2/M3 (flutter/flutter#129794)
2023-06-30 [email protected] Remove an unnecessary assert (flutter/flutter#129796)
2023-06-30 [email protected] Update `Radio` tests for M2/M3 (flutter/flutter#129814)
2023-06-30 [email protected] Update `Switch` tests for M2/M3 (flutter/flutter#129810)
2023-06-30 [email protected] Roll Flutter Engine from 099a70ebbc60 to 54b573e9c4e5 (1 revision) (flutter/flutter#129821)
2023-06-30 [email protected] Update `SwitchListTile` tests for M2/M3 (flutter/flutter#129809)
2023-06-30 [email protected] Fix `NavigationDrawer` selected item has wrong icon color (flutter/flutter#129625)
2023-06-30 [email protected] Update basic_test.dart for M3 compliance (flutter/flutter#129714)
2023-06-30 [email protected] Roll Flutter Engine from d33343430f18 to 099a70ebbc60 (7 revisions) (flutter/flutter#129818)
2023-06-30 [email protected] Roll Flutter Engine from 68cc1a7971d5 to d33343430f18 (2 revisions) (flutter/flutter#129801)
2023-06-30 [email protected] Revert no-response to fork. (flutter/flutter#129775)
2023-06-30 [email protected] Make `DropdownMenu` be able to scroll to the highlighted item when searching. (flutter/flutter#129740)
2023-06-29 [email protected] Roll Flutter Engine from cd9ce66db14a to 68cc1a7971d5 (10 revisions) (flutter/flutter#129799)
2023-06-29 49699333+dependabot[bot]@users.noreply.github.com Bump actions/labeler from 4.1.0 to 4.2.0 (flutter/flutter#129797)
2023-06-29 [email protected] Roll Flutter Engine from eabb22900b44 to cd9ce66db14a (1 revision) (flutter/flutter#129756)
2023-06-29 [email protected] Remove `@NonNull` to avoid warning (flutter/flutter#129472)
2023-06-29 [email protected] Remove use of any (flutter/flutter#129793)
2023-06-29 [email protected] Prepare for utf8.encode() to return more precise Uint8List type (flutter/flutter#129769)
2023-06-29 [email protected] Deletes files that should be ignored (flutter/flutter#127984)
2023-06-29 [email protected] Fix flutter_plugins by rolling revision (flutter/flutter#129781)

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],[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://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 16, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 17, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 17, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Aug 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autosubmit Merge PR when tree becomes green via auto submit App 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.

DropdownMenu does not scroll to highlighted item when searching

2 participants