-
Notifications
You must be signed in to change notification settings - Fork 29.8k
Fix TextButton.icon breaks focus traversal and ink effect when toggling icon #176579
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 TextButton.icon breaks focus traversal and ink effect when toggling icon #176579
Conversation
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.
Code Review
This pull request addresses an issue where TextButton.icon loses focus when its icon is toggled. The implementation refactors the TextButton.icon factory into a named constructor. This change prevents the widget from being rebuilt, which preserves its state, including focus. The _TextButtonWithIcon subclass is removed, and its padding logic is integrated into TextButton. A regression test is added to verify that focus is maintained when the icon is nullified. My review includes a suggestion to update a doc comment that has become inaccurate due to these changes.
89921ce to
d46cf10
Compare
d46cf10 to
d5f104b
Compare
chunhtai
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, looks like it is the same for ElevatedButton and FilledButton as well. I wish we have some way to share code without exposing additional API
|
@chunhtai Are there any visual diffs in the Google testing failures? Or are those failures related to tests looking up widgets by type? |
|
I saw a button that was previous disabled but becomes enabled, maybe some of the enabling or onpress callback is not wire up correctly? |
|
This is their code, are we overriding the disable style somehow? final style =
buttonStyle ??
TextButton.styleFrom(
foregroundColor: theme.colors.primary,
disabledForegroundColor: theme.colors.onSurfaceVariant,
iconColor: theme.colors.primary,
disabledIconColor: theme.colors.onSurfaceVariant,
textStyle: buttonSize == ButtonSize.medium
? theme.textStyles.labelLarge
: theme.textStyles.bodyMedium,
);
return TextButton(
onPressed: onTap != null
? () {
onTap!();
}
: null,
style: style,
child: Text(label),
); |
Thanks for providing this code extract 🙏 |
d5f104b to
16363ef
Compare
|
All checks are green now but this is because the Google testing check did not run automatically after I pushed a new commit. @Piinks This is a case where the Google testing does not run automatically after a new commit (maybe it will in an indeterminate delay?). The problem here is that someone might jump in and merge this PR, then we will have to revert it later. |
|
Filed #176721 and reached out to the infra team. I will rebase here to try once more. |
|
@chunhtai We looked again at the change, the screenshot and the code extract and we have no clue. If you can share more of the code extract we might understand how it can happen. |
|
It seems to be a timing issue that the internal test is relies on frame perfect timing of a screen shot. |
|
cl up cl/823197890, this won't fixed the google test failure, but will at least make scuba triaging less confusing |
chunhtai
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
flutter/flutter@7cf0dc1...df72035 2025-10-29 engine-flutter-autoroll@skia.org Roll Packages from c8ba0cc to 41c6b3d (3 revisions) (flutter/flutter#177725) 2025-10-29 43054281+camsim99@users.noreply.github.com [Android] Remove unecessary `spy` in `FlutterActivityAndFragmentDelegateTest` (flutter/flutter#177120) 2025-10-29 stuartmorgan@google.com Add discussion of federated plugin documentation (flutter/flutter#177659) 2025-10-29 mdebbar@google.com [web] Deprecate --pwa-strategy (flutter/flutter#177613) 2025-10-29 engine-flutter-autoroll@skia.org Roll Skia from 53b8b802bbc4 to 0a0c9f8c704f (1 revision) (flutter/flutter#177701) 2025-10-29 alex.medinsh@gmail.com Add `Navigator.popUntilWithResult` (flutter/flutter#169341) 2025-10-29 116356835+AbdeMohlbi@users.noreply.github.com Replace deprecated `withOpacity` with `withValues` in `text_style.dart` (flutter/flutter#177537) 2025-10-29 116356835+AbdeMohlbi@users.noreply.github.com Replace deprecated withOpacity in `radio.1.dart` example (flutter/flutter#177606) 2025-10-29 engine-flutter-autoroll@skia.org Roll Skia from 4408d8ea88b0 to 53b8b802bbc4 (2 revisions) (flutter/flutter#177698) 2025-10-29 robert.ancell@canonical.com Remove generated file from template manifest (flutter/flutter#177034) 2025-10-29 engine-flutter-autoroll@skia.org Roll Skia from e582a5594b6f to 4408d8ea88b0 (5 revisions) (flutter/flutter#177691) 2025-10-28 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from ir6J2isKAYa1jNLyJ... to 3EF6k6lqXPWDwrdyj... (flutter/flutter#177682) 2025-10-28 jesswon@google.com [Gradle 9] Fix Engine Deps (flutter/flutter#177623) 2025-10-28 116356835+AbdeMohlbi@users.noreply.github.com Replace deprecated `withOpacity` in `focus_scope.0.dart` example (flutter/flutter#177542) 2025-10-28 bruno.leroux@gmail.com Fix EditableText _justResumed is not accurate (flutter/flutter#177658) 2025-10-28 116356835+AbdeMohlbi@users.noreply.github.com Replace deprecated `withOpacity` in `interactive_viewer.builder.0.dart` (flutter/flutter#177541) 2025-10-28 bruno.leroux@gmail.com Fix TextButton.icon breaks focus traversal and ink effect when toggling icon (flutter/flutter#176579) 2025-10-28 jesswon@google.com [Android 16] Update Engine `ci.yaml` to test against Java 21 (flutter/flutter#177677) 2025-10-28 116356835+AbdeMohlbi@users.noreply.github.com Replace deprecated `withOpacity` in `interactive_viewer.constrained.0.dart` (flutter/flutter#177540) 2025-10-28 116356835+AbdeMohlbi@users.noreply.github.com Replace opacity from random color in navigation bar test (flutter/flutter#177490) 2025-10-28 engine-flutter-autoroll@skia.org Roll Skia from e4d3d8f31aef to e582a5594b6f (6 revisions) (flutter/flutter#177679) 2025-10-28 matej.knopp@gmail.com Workaround for lag when dragging window titlebar on Windows (flutter/flutter#177597) 2025-10-28 engine-flutter-autoroll@skia.org Roll Packages from bbf96a0 to c8ba0cc (2 revisions) (flutter/flutter#177672) 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 bmparr@google.com,stuartmorgan@google.com 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
…ng icon (flutter#176579) ## Description This PR changes `TextButton.icon` to avoid building a different widget. When a different widget is created the whole subtree is recreated which leads to various issues (Focus and A11y issues for instance). The change is similar to flutter#175810 which fixed the exact same problem for `OutlinedButton.icon`. ## Related Issue Fixes [TextButton.icon breaks focus traversal and ink effect when toggling icon](flutter#173944) ## Tests - Adds 1 test --------- Co-authored-by: chunhtai <47866232+chunhtai@users.noreply.github.com>
…ng icon (flutter#176579) ## Description This PR changes `TextButton.icon` to avoid building a different widget. When a different widget is created the whole subtree is recreated which leads to various issues (Focus and A11y issues for instance). The change is similar to flutter#175810 which fixed the exact same problem for `OutlinedButton.icon`. ## Related Issue Fixes [TextButton.icon breaks focus traversal and ink effect when toggling icon](flutter#173944) ## Tests - Adds 1 test --------- Co-authored-by: chunhtai <47866232+chunhtai@users.noreply.github.com>


Description
This PR changes
TextButton.iconto avoid building a different widget. When a different widget is created the whole subtree is recreated which leads to various issues (Focus and A11y issues for instance).The change is similar to #175810 which fixed the exact same problem for
OutlinedButton.icon.Related Issue
Fixes TextButton.icon breaks focus traversal and ink effect when toggling icon
Tests