Skip to content

[material_ui] Repaint NavigationIndicator when the selection changes without pointer input - #13010

Merged
auto-submit[bot] merged 3 commits into
flutter:mainfrom
theprantadutta:material_ui/navigation-indicator-repaint
Oct 2, 2026
Merged

auto-submit[bot] merged 3 commits into
flutter:mainfrom
theprantadutta:material_ui/navigation-indicator-repaint

Conversation

@theprantadutta

Copy link
Copy Markdown
Contributor

Port of flutter/flutter#187802 to material_ui, following the process in flutter/flutter#188444. The original PR was approved by dkwingsmt and QuncCccccc but couldn't land because of the Material/Cupertino code freeze.

NavigationIndicator draws its indicator with an Ink, which paints on the nearest ancestor Material rather than locally. When the indicator animates without an accompanying pointer interaction — for example when selectedIndex is changed programmatically — nothing tells that Material to repaint, so it keeps showing the indicator's previous frame. The fix calls Material.of(context).markNeedsPaint() on each animation tick.

The regression test pumps a NavigationDrawer, changes selectedIndex from outside without any pointer events, and verifies the indicator repaints. I checked it fails with the one-line fix removed and passes with it, in its new location under packages/material_ui/test/.

The two original commits were cherry-picked without merge commits, as the porting guide describes; rename detection placed them at lib/src/navigation_bar.dart and test/navigation_drawer_test.dart with no conflicts. The only new commit adds the pending changelog entry (version: patch).

Fixes flutter/flutter#180359

Pre-Review Checklist

I used AI tooling while working on this, and reviewed and tested all of it myself.

Footnotes

  1. Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. ↩ ↩2

NavigationIndicator draws its background with an Ink widget, which
paints on the nearest ancestor Material rather than on its own render
object. When the selected index changes without a pointer interaction
(for example, programmatically alongside an IndexedStack), nothing
notifies that Material, so it keeps showing the indicator's previous
frame; in a NavigationDrawer the highlight visibly sticks to the old
destination until a hover, click, or resize forces a repaint.

Notify the indicator's MaterialInkController whenever the indicator
animation ticks, the same way ink features such as InkHighlight request
repaints when their state changes.

Fixes flutter/flutter#180359
@github-actions github-actions Bot added p: material_ui triage-design Should be looked at in design triage labels Sep 25, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request fixes an issue where the NavigationIndicator fails to repaint when the selected index changes programmatically without pointer interaction. This is resolved by calling Material.of(context).markNeedsPaint() when the animation ticks. A regression test has been added to navigation_drawer_test.dart to verify that the hosting Material is marked as needing paint when the index changes, and a pending changelog entry has been created. There are no review comments, and I have no feedback to provide.

@elliette elliette left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM! Thanks for porting this over. Adding the original reviewers for a secondary review.

@QuncCccccc QuncCccccc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM. Thanks for your contribution:)!

@dkwingsmt dkwingsmt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks!

@dkwingsmt dkwingsmt added the autosubmit Merge PR when tree becomes green via auto submit App label Oct 1, 2026
@auto-submit
auto-submit Bot merged commit 499f859 into flutter:main Oct 2, 2026
13 checks passed
jesswrd pushed a commit to jesswrd/flutter that referenced this pull request Oct 2, 2026
…er#193711)

flutter/packages@d5ec6db...5620e65

2026-10-02 [email protected] [material_ui]
Migrate M3 Menu template to use new gen_defaults
(flutter/packages#13057)
2026-10-02 [email protected]
[material_ui] Repaint NavigationIndicator when the selection changes
without pointer input (flutter/packages#13010)
2026-10-01 [email protected] [tool] Use flutter pub for packages that
depend on jni (flutter/packages#13087)
2026-10-01 [email protected] [material_ui]
Migrate M3 snackbar defaults to new gen_defaults
(flutter/packages#13009)
2026-10-01 [email protected] Manual roll Flutter (stable)
from 6a19cca to 5fc3468 (6 revisions) (flutter/packages#13105)
2026-10-01 [email protected] Manual roll Flutter from
d649d2b to e89fd0a (27 revisions) (flutter/packages#13104)
2026-10-01 [email protected] [webview_flutter]
Add gesture blocking policy to WebKitWebViewWidgetCreationParams
(flutter/packages#12496)
2026-10-01 [email protected] [material_ui]
Update Material tokens to Material version 38.2.83
(flutter/packages#13082)
2026-10-01 [email protected] [material_ui] Migrate
MaterialApp API doc snippets to {@example} and add unit tests (batch 6)
(flutter/packages#13021)
2026-10-01 [email protected] [material_ui] Migrate
AppBar, SliverAppBar, BottomAppBar, and Scaffold API doc snippets to
{@example} (batch 7) (flutter/packages#13023)
2026-10-01 [email protected] [various] Update Robolectric to 4.17
(flutter/packages#13041)
2026-10-01 [email protected] [pigeon] pin native interop related dev
deps and update some docs (flutter/packages#13103)
2026-10-01 [email protected] [tool] Add more documentation
(flutter/packages#13063)

If this roll has caused a breakage, revert this CL and set the roller
to dry run mode using the controls here:
https://autoroll.skia.org/r/flutter-packages-flutter-autoroll
Please CC [email protected] on the revert to ensure that a
human
is aware of the problem.

To file a bug in Flutter:
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
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 CICD Run CI/CD p: material_ui triage-design Should be looked at in design triage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NavigationDrawer highlight is wrong when changing index from elsewhere

4 participants