Skip to content

WidgetStatesConstraint as a mixin - #181704

Merged
auto-submit[bot] merged 2 commits into
flutter:masterfrom
nate-thegrate:widget-state-mixin
Feb 26, 2026
Merged

auto-submit[bot] merged 2 commits into
flutter:masterfrom
nate-thegrate:widget-state-mixin

Conversation

@nate-thegrate

Copy link
Copy Markdown
Contributor

This PR removes the WidgetStateOperators extension, per the style guide.

Should be a non-breaking change.

@github-actions github-actions Bot added framework flutter/packages/flutter repository. See also f: labels. d: api docs Issues with https://api.flutter.dev/ d: examples Sample code and demos labels Jan 30, 2026
@nate-thegrate
nate-thegrate marked this pull request as ready for review January 30, 2026 04:11

@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 refactors WidgetStatesConstraint from an abstract interface class to a mixin, moving operator logic from the WidgetStateOperators extension directly into the mixin. This change aligns with the Flutter style guide's recommendation to avoid extensions on base types. All implementing classes are updated to use the mixin, and a new test is added to validate the change. The refactoring is well-executed and achieves its goal.

@justinmc

justinmc commented Feb 3, 2026

Copy link
Copy Markdown
Contributor

@nate-thegrate Would you mind looking up the PR that added this change so we can see why this was done in the first place?

@nate-thegrate

Copy link
Copy Markdown
Contributor Author

Here's the PR that added this change:


Originally, I had an abstract interface class and a mixin, and WidgetState was a subtype of both. But it led to these weird Google Testing failures that seemed impossible to debug, so I switched over to extension methods and got everything working.

A few months back I realized that it could have just been a single mixin, which I feel is much better in terms of readability and reducing the amount of types we export in the widgets library.

@loic-sharma

loic-sharma commented Feb 5, 2026 •

Copy link
Copy Markdown
Member

FYI, I'll be doing a Dash Forum tomorrow that proposes loosing our extension method restrictions: flutter.dev/go/flutter-style-updates.

The new guidance - if accepted - will allow extension methods with guardrails that nudge folks towards instance methods. You can see my draft of the new guidance here: #181934

Anywho, this change looks good to me regardless. Thanks for the contribution!

@justinmc justinmc 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 👍 . Thank you for the explanation and for coming back to clean this up!

Comment thread examples/api/test/widgets/widget_state/widget_state_property.0_test.dart Outdated
@justinmc justinmc added the autosubmit Merge PR when tree becomes green via auto submit App label Feb 25, 2026
@auto-submit
auto-submit Bot added this pull request to the merge queue Feb 25, 2026
Merged via the queue into flutter:master with commit 486d116 Feb 26, 2026
73 of 74 checks passed
@flutter-dashboard flutter-dashboard Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Feb 26, 2026
@nate-thegrate
nate-thegrate deleted the widget-state-mixin branch February 26, 2026 02:13
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 26, 2026
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 26, 2026
ahmedsameha1 pushed a commit to ahmedsameha1/flutter that referenced this pull request Feb 27, 2026
This PR removes the `WidgetStateOperators` extension, per the [style
guide](https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md#avoid-using-extension).

Should be a non-breaking change.
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 27, 2026
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 27, 2026
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Feb 27, 2026
Roll Flutter from b31548feb941 to 1141b2bdce66 (56 revisions)

flutter/flutter@b31548f...1141b2b

2026-02-27 [email protected] flutter#182361 Fix delegate copy on plugins init (flutter/flutter#182362)
2026-02-27 [email protected] Roll Dart SDK from 8b036b3e63cb to 1cdb7dfd913e (1 revision) (flutter/flutter#183004)
2026-02-27 [email protected] Manual roll Dart SDK to 3.12.0-192.0.dev (flutter/flutter#182883)
2026-02-27 [email protected] Roll Skia from e2062707b0c0 to ed220c490eea (1 revision) (flutter/flutter#182992)
2026-02-27 [email protected] Roll Skia from e5aa1ab5c59c to e2062707b0c0 (3 revisions) (flutter/flutter#182989)
2026-02-27 [email protected] Linux build hooks: Read compiler config from CMakeCache.txt (flutter/flutter#181004)
2026-02-27 [email protected] Roll ICU from a86a32e67b8d to 7971660ba630 (3 revisions) (flutter/flutter#182986)
2026-02-27 [email protected] Roll Skia from 49c2de95384e to e5aa1ab5c59c (2 revisions) (flutter/flutter#182980)
2026-02-27 [email protected] [Impeller] Remove shared rendering data from TextFrame (flutter/flutter#182886)
2026-02-27 [email protected] Add fl_view_new_sized_to_content() (flutter/flutter#182924)
2026-02-27 [email protected] [Shortcuts] Improve focus node debug labels (flutter/flutter#181834)
2026-02-27 [email protected] Add a cli flag for toggling HCPP use, and enable it (flutter/flutter#182516)
2026-02-27 [email protected] `SizedBox.square()` (flutter/flutter#182731)
2026-02-27 [email protected] [web] Fix stack corruption in Skwasm and harden withStackScope API (flutter/flutter#182912)
2026-02-26 [email protected] Roll zlib to 7eda07b1e067 (flutter/flutter#182692)
2026-02-26 [email protected] [ CI ] Don't crash analysis when ktlint isn't on PATH (flutter/flutter#181854)
2026-02-26 [email protected] Add calls to await `flutterDriver.waitUntilFirstFrameRasterized()` for all `android_engine_test` screenshot tests (flutter/flutter#182961)
2026-02-26 [email protected] Roll Skia from f44d7db68805 to 49c2de95384e (30 revisions) (flutter/flutter#182957)
2026-02-26 [email protected] Support sending window constraints in metrics events (flutter/flutter#182921)
2026-02-26 [email protected] Reland: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test (flutter/flutter#182891)
2026-02-26 [email protected] Remove some instances of useMaterial3: true (flutter/flutter#182944)
2026-02-26 [email protected] [Impeller] Use bilinear filtering for non-uniform scaled text (flutter/flutter#182224)
2026-02-26 [email protected] Add a ResidentCompilerFactory to create ResidentCompiler instances. (flutter/flutter#182930)
2026-02-26 [email protected] Add a getter in run.dart to access use-application-binary flag. (flutter/flutter#182931)
2026-02-26 [email protected] [web] Roll Firefox to 148 (flutter/flutter#182859)
2026-02-26 [email protected] Roll Packages from acd9adb to e1d0169 (8 revisions) (flutter/flutter#182946)
2026-02-26 [email protected] Roll Fuchsia Linux SDK from XI0Ax7fbtYE4XKYAQ... to G1GwOdVt5bM7GjMSY... (flutter/flutter#182942)
2026-02-26 [email protected] Add test for WindowPositioner.toString (flutter/flutter#182906)
2026-02-26 [email protected] Remove unused function prototype (flutter/flutter#182915)
2026-02-26 [email protected] Resolve inconsistency with SchedulerBinding.scheduleTask usage recomm… (flutter/flutter#182531)
2026-02-26 [email protected] Fix false positives for hit test misses in flutter_test (flutter/flutter#180856)
2026-02-26 [email protected] Replace an instance of flutter/engine with flutter/flutter (flutter/flutter#182655)
2026-02-26 [email protected] Use null-aware elements in widgets/routes.dart (flutter/flutter#181242)
2026-02-26 [email protected] Fix typos in method names across multiple files (flutter/flutter#182584)
2026-02-26 [email protected] Fix RawAutocomplete crash when options are hidden (flutter/flutter#182785)
2026-02-26 [email protected] Describe implications of tree-status and Google Testing for PRs (flutter/flutter#182916)
2026-02-26 [email protected] Make sure that a StretchingOverscrollIndicator doesn't crash when it … (flutter/flutter#182499)
2026-02-26 [email protected] framework: Use a super-parameter in several missed cases (flutter/flutter#182580)
2026-02-25 [email protected] `WidgetStatesConstraint` as a mixin (flutter/flutter#181704)
2026-02-25 [email protected] Paint the paragraph as a single image (flutter/flutter#181206)
2026-02-25 [email protected] Remove `ExtendSelectionByPageIntent` (flutter/flutter#182642)
2026-02-25 [email protected] feat: add few required properties to test widgets app (flutter/flutter#182805)
2026-02-25 [email protected] Updates MenuAnchor to respect software keyboard (flutter/flutter#180975)
2026-02-25 [email protected] Roll ImGui to v1.92.6-docking (flutter/flutter#182799)
2026-02-25 [email protected] Roll GoogleTest to e9907112b472 (flutter/flutter#182795)
2026-02-25 [email protected] Make positionInlineChildren assert much clearer (flutter/flutter#182093)
...
xxxOVALxxx pushed a commit to xxxOVALxxx/flutter that referenced this pull request Mar 10, 2026
This PR removes the `WidgetStateOperators` extension, per the [style
guide](https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md#avoid-using-extension).

Should be a non-breaking change.
okorohelijah pushed a commit to okorohelijah/packages that referenced this pull request Mar 26, 2026
…r#11137)

Roll Flutter from b31548feb941 to 1141b2bdce66 (56 revisions)

flutter/flutter@b31548f...1141b2b

2026-02-27 [email protected] flutter#182361 Fix delegate copy on plugins init (flutter/flutter#182362)
2026-02-27 [email protected] Roll Dart SDK from 8b036b3e63cb to 1cdb7dfd913e (1 revision) (flutter/flutter#183004)
2026-02-27 [email protected] Manual roll Dart SDK to 3.12.0-192.0.dev (flutter/flutter#182883)
2026-02-27 [email protected] Roll Skia from e2062707b0c0 to ed220c490eea (1 revision) (flutter/flutter#182992)
2026-02-27 [email protected] Roll Skia from e5aa1ab5c59c to e2062707b0c0 (3 revisions) (flutter/flutter#182989)
2026-02-27 [email protected] Linux build hooks: Read compiler config from CMakeCache.txt (flutter/flutter#181004)
2026-02-27 [email protected] Roll ICU from a86a32e67b8d to 7971660ba630 (3 revisions) (flutter/flutter#182986)
2026-02-27 [email protected] Roll Skia from 49c2de95384e to e5aa1ab5c59c (2 revisions) (flutter/flutter#182980)
2026-02-27 [email protected] [Impeller] Remove shared rendering data from TextFrame (flutter/flutter#182886)
2026-02-27 [email protected] Add fl_view_new_sized_to_content() (flutter/flutter#182924)
2026-02-27 [email protected] [Shortcuts] Improve focus node debug labels (flutter/flutter#181834)
2026-02-27 [email protected] Add a cli flag for toggling HCPP use, and enable it (flutter/flutter#182516)
2026-02-27 [email protected] `SizedBox.square()` (flutter/flutter#182731)
2026-02-27 [email protected] [web] Fix stack corruption in Skwasm and harden withStackScope API (flutter/flutter#182912)
2026-02-26 [email protected] Roll zlib to 7eda07b1e067 (flutter/flutter#182692)
2026-02-26 [email protected] [ CI ] Don't crash analysis when ktlint isn't on PATH (flutter/flutter#181854)
2026-02-26 [email protected] Add calls to await `flutterDriver.waitUntilFirstFrameRasterized()` for all `android_engine_test` screenshot tests (flutter/flutter#182961)
2026-02-26 [email protected] Roll Skia from f44d7db68805 to 49c2de95384e (30 revisions) (flutter/flutter#182957)
2026-02-26 [email protected] Support sending window constraints in metrics events (flutter/flutter#182921)
2026-02-26 [email protected] Reland: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test (flutter/flutter#182891)
2026-02-26 [email protected] Remove some instances of useMaterial3: true (flutter/flutter#182944)
2026-02-26 [email protected] [Impeller] Use bilinear filtering for non-uniform scaled text (flutter/flutter#182224)
2026-02-26 [email protected] Add a ResidentCompilerFactory to create ResidentCompiler instances. (flutter/flutter#182930)
2026-02-26 [email protected] Add a getter in run.dart to access use-application-binary flag. (flutter/flutter#182931)
2026-02-26 [email protected] [web] Roll Firefox to 148 (flutter/flutter#182859)
2026-02-26 [email protected] Roll Packages from acd9adb to e1d0169 (8 revisions) (flutter/flutter#182946)
2026-02-26 [email protected] Roll Fuchsia Linux SDK from XI0Ax7fbtYE4XKYAQ... to G1GwOdVt5bM7GjMSY... (flutter/flutter#182942)
2026-02-26 [email protected] Add test for WindowPositioner.toString (flutter/flutter#182906)
2026-02-26 [email protected] Remove unused function prototype (flutter/flutter#182915)
2026-02-26 [email protected] Resolve inconsistency with SchedulerBinding.scheduleTask usage recomm… (flutter/flutter#182531)
2026-02-26 [email protected] Fix false positives for hit test misses in flutter_test (flutter/flutter#180856)
2026-02-26 [email protected] Replace an instance of flutter/engine with flutter/flutter (flutter/flutter#182655)
2026-02-26 [email protected] Use null-aware elements in widgets/routes.dart (flutter/flutter#181242)
2026-02-26 [email protected] Fix typos in method names across multiple files (flutter/flutter#182584)
2026-02-26 [email protected] Fix RawAutocomplete crash when options are hidden (flutter/flutter#182785)
2026-02-26 [email protected] Describe implications of tree-status and Google Testing for PRs (flutter/flutter#182916)
2026-02-26 [email protected] Make sure that a StretchingOverscrollIndicator doesn't crash when it … (flutter/flutter#182499)
2026-02-26 [email protected] framework: Use a super-parameter in several missed cases (flutter/flutter#182580)
2026-02-25 [email protected] `WidgetStatesConstraint` as a mixin (flutter/flutter#181704)
2026-02-25 [email protected] Paint the paragraph as a single image (flutter/flutter#181206)
2026-02-25 [email protected] Remove `ExtendSelectionByPageIntent` (flutter/flutter#182642)
2026-02-25 [email protected] feat: add few required properties to test widgets app (flutter/flutter#182805)
2026-02-25 [email protected] Updates MenuAnchor to respect software keyboard (flutter/flutter#180975)
2026-02-25 [email protected] Roll ImGui to v1.92.6-docking (flutter/flutter#182799)
2026-02-25 [email protected] Roll GoogleTest to e9907112b472 (flutter/flutter#182795)
2026-02-25 [email protected] Make positionInlineChildren assert much clearer (flutter/flutter#182093)
...
mboetger pushed a commit to mboetger/flutter that referenced this pull request Mar 26, 2026
This PR removes the `WidgetStateOperators` extension, per the [style
guide](https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md#avoid-using-extension).

Should be a non-breaking change.
creatorpiyush pushed a commit to creatorpiyush/packages that referenced this pull request Jun 10, 2026
…r#11137)

Roll Flutter from b31548feb941 to 1141b2bdce66 (56 revisions)

flutter/flutter@b31548f...1141b2b

2026-02-27 [email protected] flutter#182361 Fix delegate copy on plugins init (flutter/flutter#182362)
2026-02-27 [email protected] Roll Dart SDK from 8b036b3e63cb to 1cdb7dfd913e (1 revision) (flutter/flutter#183004)
2026-02-27 [email protected] Manual roll Dart SDK to 3.12.0-192.0.dev (flutter/flutter#182883)
2026-02-27 [email protected] Roll Skia from e2062707b0c0 to ed220c490eea (1 revision) (flutter/flutter#182992)
2026-02-27 [email protected] Roll Skia from e5aa1ab5c59c to e2062707b0c0 (3 revisions) (flutter/flutter#182989)
2026-02-27 [email protected] Linux build hooks: Read compiler config from CMakeCache.txt (flutter/flutter#181004)
2026-02-27 [email protected] Roll ICU from a86a32e67b8d to 7971660ba630 (3 revisions) (flutter/flutter#182986)
2026-02-27 [email protected] Roll Skia from 49c2de95384e to e5aa1ab5c59c (2 revisions) (flutter/flutter#182980)
2026-02-27 [email protected] [Impeller] Remove shared rendering data from TextFrame (flutter/flutter#182886)
2026-02-27 [email protected] Add fl_view_new_sized_to_content() (flutter/flutter#182924)
2026-02-27 [email protected] [Shortcuts] Improve focus node debug labels (flutter/flutter#181834)
2026-02-27 [email protected] Add a cli flag for toggling HCPP use, and enable it (flutter/flutter#182516)
2026-02-27 [email protected] `SizedBox.square()` (flutter/flutter#182731)
2026-02-27 [email protected] [web] Fix stack corruption in Skwasm and harden withStackScope API (flutter/flutter#182912)
2026-02-26 [email protected] Roll zlib to 7eda07b1e067 (flutter/flutter#182692)
2026-02-26 [email protected] [ CI ] Don't crash analysis when ktlint isn't on PATH (flutter/flutter#181854)
2026-02-26 [email protected] Add calls to await `flutterDriver.waitUntilFirstFrameRasterized()` for all `android_engine_test` screenshot tests (flutter/flutter#182961)
2026-02-26 [email protected] Roll Skia from f44d7db68805 to 49c2de95384e (30 revisions) (flutter/flutter#182957)
2026-02-26 [email protected] Support sending window constraints in metrics events (flutter/flutter#182921)
2026-02-26 [email protected] Reland: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test (flutter/flutter#182891)
2026-02-26 [email protected] Remove some instances of useMaterial3: true (flutter/flutter#182944)
2026-02-26 [email protected] [Impeller] Use bilinear filtering for non-uniform scaled text (flutter/flutter#182224)
2026-02-26 [email protected] Add a ResidentCompilerFactory to create ResidentCompiler instances. (flutter/flutter#182930)
2026-02-26 [email protected] Add a getter in run.dart to access use-application-binary flag. (flutter/flutter#182931)
2026-02-26 [email protected] [web] Roll Firefox to 148 (flutter/flutter#182859)
2026-02-26 [email protected] Roll Packages from acd9adb to e1d0169 (8 revisions) (flutter/flutter#182946)
2026-02-26 [email protected] Roll Fuchsia Linux SDK from XI0Ax7fbtYE4XKYAQ... to G1GwOdVt5bM7GjMSY... (flutter/flutter#182942)
2026-02-26 [email protected] Add test for WindowPositioner.toString (flutter/flutter#182906)
2026-02-26 [email protected] Remove unused function prototype (flutter/flutter#182915)
2026-02-26 [email protected] Resolve inconsistency with SchedulerBinding.scheduleTask usage recomm… (flutter/flutter#182531)
2026-02-26 [email protected] Fix false positives for hit test misses in flutter_test (flutter/flutter#180856)
2026-02-26 [email protected] Replace an instance of flutter/engine with flutter/flutter (flutter/flutter#182655)
2026-02-26 [email protected] Use null-aware elements in widgets/routes.dart (flutter/flutter#181242)
2026-02-26 [email protected] Fix typos in method names across multiple files (flutter/flutter#182584)
2026-02-26 [email protected] Fix RawAutocomplete crash when options are hidden (flutter/flutter#182785)
2026-02-26 [email protected] Describe implications of tree-status and Google Testing for PRs (flutter/flutter#182916)
2026-02-26 [email protected] Make sure that a StretchingOverscrollIndicator doesn't crash when it … (flutter/flutter#182499)
2026-02-26 [email protected] framework: Use a super-parameter in several missed cases (flutter/flutter#182580)
2026-02-25 [email protected] `WidgetStatesConstraint` as a mixin (flutter/flutter#181704)
2026-02-25 [email protected] Paint the paragraph as a single image (flutter/flutter#181206)
2026-02-25 [email protected] Remove `ExtendSelectionByPageIntent` (flutter/flutter#182642)
2026-02-25 [email protected] feat: add few required properties to test widgets app (flutter/flutter#182805)
2026-02-25 [email protected] Updates MenuAnchor to respect software keyboard (flutter/flutter#180975)
2026-02-25 [email protected] Roll ImGui to v1.92.6-docking (flutter/flutter#182799)
2026-02-25 [email protected] Roll GoogleTest to e9907112b472 (flutter/flutter#182795)
2026-02-25 [email protected] Make positionInlineChildren assert much clearer (flutter/flutter#182093)
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

d: api docs Issues with https://api.flutter.dev/ d: examples Sample code and demos framework flutter/packages/flutter repository. See also f: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants