-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Fix InkWell overlayColor resolution ignores selected state #159072
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 InkWell overlayColor resolution ignores selected state #159072
Conversation
6c2fe5e to
0612cec
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 with a few typo nits in the docs 👍
| const Set<MaterialState> highlightableStates = <MaterialState>{MaterialState.focused, MaterialState.hovered, MaterialState.pressed}; | ||
| final Set<MaterialState> nonHighlightableStates = statesController.value.difference(highlightableStates); | ||
| // Each highlightable states will be resolved separatly to get the corresponding color. | ||
| // For this resolution to be correct, The non-highlightable states should be preserved. |
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.
"The" => "the"
| final ThemeData theme = Theme.of(context); | ||
| const Set<MaterialState> highlightableStates = <MaterialState>{MaterialState.focused, MaterialState.hovered, MaterialState.pressed}; | ||
| final Set<MaterialState> nonHighlightableStates = statesController.value.difference(highlightableStates); | ||
| // Each highlightable states will be resolved separatly to get the corresponding color. |
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.
"states" => "state"
"separatly" => "separately"
| import '../widgets/semantics_tester.dart'; | ||
|
|
||
| void main() { | ||
| RenderObject getInkFeatures(WidgetTester tester) { |
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 call splitting this out.
| final Set<MaterialState> nonHighlightableStates = statesController.value.difference(highlightableStates); | ||
| // Each highlightable states will be resolved separatly to get the corresponding color. | ||
| // For this resolution to be correct, The non-highlightable states should be preserved. | ||
| final Set<MaterialState> pressed = <MaterialState>{...nonHighlightableStates, MaterialState.pressed}; |
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 is kind of tricky, I hope we don't make this same kind of mistake elsewhere. I guess it's probably rare to speculatively resolve a color like this, though.
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 hope we don't make this same kind of mistake elsewher
I looked at various places where the color are resolved. I think this one is somewhat particular because most of InkWell logic was written way before widget state controllers were introduced. For instance the getHighlightColorForType function was added in #31438 and then was updated and moved later.
This logic can probably be simplified, but because this is a core widget I tried to fix the issue without taking risk.
|
@justinmc Thanks for the review, especially for catching these typos. 🙏 Let see how it goes with Google testing because this might break some golden (if there are golden capturing hovering, focused or pressed state). For instance, with this fix hovered color for some widgets which have a selected state (such as IconButton) is slightly different (the change is slight because the defaults colors are very close but this could be noticed when comparing screenshots.
|
0612cec to
9ff6c2f
Compare
flutter/flutter@b3818f6...8536b96 2024-11-19 [email protected] Terminate `flutter test` when no longer needed in integration test. (flutter/flutter#159117) 2024-11-19 [email protected] Terminate the test device if the `flutter` tool is signal-killed. (flutter/flutter#159115) 2024-11-19 [email protected] Roll Packages from c1eabf5 to fc4adc7 (10 revisions) (flutter/flutter#159143) 2024-11-19 [email protected] Deflake api 35 emulator tests by updating emulator definitions version to latest available from chrome infra (flutter/flutter#158017) 2024-11-19 [email protected] Roll Flutter Engine from b6723e33b858 to cff1e751f853 (1 revision) (flutter/flutter#159141) 2024-11-19 [email protected] Fix InkWell overlayColor resolution ignores selected state (flutter/flutter#159072) 2024-11-19 [email protected] Roll Flutter Engine from 983b7b85d122 to b6723e33b858 (3 revisions) (flutter/flutter#159134) 2024-11-19 [email protected] Roll Flutter Engine from c1b0e18a70b3 to 983b7b85d122 (2 revisions) (flutter/flutter#159124) 2024-11-19 [email protected] Roll Flutter Engine from 878f593802e1 to c1b0e18a70b3 (13 revisions) (flutter/flutter#159118) 2024-11-19 [email protected] [SwiftPM] Move where the migration checks feature flags (flutter/flutter#159110) 2024-11-18 [email protected] Plumbs `scrollBehavior` into `SelectableText` so that the scrollbar may be hidden (flutter/flutter#158887) 2024-11-18 [email protected] Add a tag and assert some state in FlutterTestDriver tests. (flutter/flutter#159099) 2024-11-18 49699333+dependabot[bot]@users.noreply.github.com Bump codecov/codecov-action from 4.6.0 to 5.0.2 in the all-github-actions group (flutter/flutter#159104) 2024-11-18 [email protected] Add `@protected` to public `State` method overrides (flutter/flutter#157313) 2024-11-18 [email protected] Roll Flutter Engine from 9686de154114 to 878f593802e1 (5 revisions) (flutter/flutter#159097) 2024-11-18 [email protected] Fix flaky failure related to core_device_list.json not being found (flutter/flutter#158946) 2024-11-18 [email protected] Prettier merge_queue.md (flutter/flutter#158969) 2024-11-18 [email protected] Define and use `flutterBin` consistently across `integration.shard`. (flutter/flutter#159007) 2024-11-18 [email protected] No longer download `android-x86-jit-release`. (flutter/flutter#159011) 2024-11-18 [email protected] Roll Flutter Engine from e1f4e7d9bfc4 to 9686de154114 (1 revision) (flutter/flutter#159082) 2024-11-18 [email protected] Roll Flutter Engine from f365c9f5dce3 to e1f4e7d9bfc4 (4 revisions) (flutter/flutter#159078) 2024-11-18 [email protected] Roll Packages from b164be3 to c1eabf5 (6 revisions) (flutter/flutter#159077) 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
) ## Description This PR fixes the DatePicker overlay colors for the selected days. Before this PR, overlays were obscured by the selected day backgound. This fix simply replaces a DecoratedBox with an Ink to make the overlays visible. Combined with #159072 which fixes InkWell overlay color resolution related to the selected state, this PR fixes [Date picker overlay colors aren't applied on MaterialState.selected state](#130586). Before, no overlay visible for the selected day when hovered, focused, or pressed: https://github.com/user-attachments/assets/944d5035-68b2-40da-b606-3e8795229767 After, overlay is visible for the selected day when hovered, focused, or pressed (color change is slight as defined with M3 defaults): https://github.com/user-attachments/assets/2627955b-f45a-465f-8eb0-21955ccd8c3e ## Related Issue Fixes [Date picker overlay colors aren't applied on MaterialState.selected state](#130586). ## Tests Adds 12 tests. Updates several existing tests (those tests were looking for a `DecoratedBox`, make them look for an `Ink`).
#159583) Reverts #159203 because it depends on #159072 which was flagged as a perf regression in #159337. Reverting both PRs to see if the perf regression was really related to this change or was impacted by another change. See #159337 (comment) for context.
…lutter#159072)" This reverts commit 043c59b.
…159072) (#159589) Reverts #159072 which was flagged as a perf regression in #159337. Reverting to see if the perf regression was really related to this change or was impacted by another change. See #159337 (comment) for context.
…59784) Reland #159072 without change. The initial PR was flagged for a non-related perf regression, see #159337 (comment) Fixes #159063


Description
This PR fixes
InkWelloverlay colors resolution.The
InkWelloverlay color is resolved when theInkWellis either focused, hovered , and/or pressed.This resolution happens at two places:
getHighlightColorForType.This second resolution should be aware of other current states (such as selected) as it might impact the color resolution.
For instance, several Material styles have colors resolution define similarly to:
flutter/packages/flutter/lib/src/material/date_picker_theme.dart
Lines 982 to 1006 in dc44547
Related Issue
Fixes InkWell overlay colors aren't applied on MaterialState.selected state
First step for Date picker overlay colors aren't applied on MaterialState.selected state.
Tests
Adds 3 tests.