Repository navigation
Refactor FormField build wrappers - #185795
Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces SliverFormField and SliverFormFieldState to support form field functionality for sliver-based widgets, preventing crashes caused by render-box-specific Semantics and Focus wrappers. It refactors the base FormFieldState to use overridable wrapWithSemantics and wrapWithFocus methods. Feedback suggests further refactoring by extracting the validation result and focus semantics configuration into protected getters to reduce code duplication and improve maintainability in subclasses.
30ac50c to
a380f0f
Compare
Piinks
left a comment
There was a problem hiding this comment.
Thanks for all the recent PRs! 💙
- Extract the two wraps ...
- Add SliverFormField ...
These changes should be split into two separate PRs, one for refactoring and one for the new API, could you make that change here?
|
It looks like this pull request may not have tests. Please make sure to add tests or get an explicit test exemption before merging. If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix? Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. If you believe this PR qualifies for a test exemption, contact "@test-exemption-reviewer" in the #hackers channel in Discord (don't just cc them here, they won't see it!). The test exemption team is a small volunteer group, so all reviewers should feel empowered to ask for tests, without delegating that responsibility entirely to the test exemption group. |
Thanks, that makes sense. I split this PR down to just the refactor: it now only extracts the FormFieldState semantics/focus wrapping hooks, with no SliverFormField API or issue-closing reference. I also added focused tests for the refactor itself after the dashboard note. The SliverFormField API can follow in a separate PR once this lands. |
5c8dad2 to
14e751e
Compare
|
This pull request executed golden file tests, but it has not been updated in a while (20+ days). Test results from Gold expire after as many days, so this pull request will need to be updated with a fresh commit in order to get results from Gold. For more guidance, visit Writing a golden file test for Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. |
`FormField.builder` may legitimately return a sliver — see issue flutter#173912. flutter#165935 added a `Semantics` wrap around the builder result to publish a `SemanticsValidationResult`, but `Semantics` is a render-box widget, so the wrap throws `A RenderSemanticsAnnotations expected a child of type RenderBox but received a child of type RenderSliverList.` for any builder that returns a sliver. The `Focus` wrap added when `autovalidateMode == onUnfocus` has the same shape and the same problem. This commit: * Extracts the two wraps into protected `wrapWithSemantics` / `wrapWithFocus` methods on `FormFieldState<T>`, no behavior change for the existing widget. * Adds `SliverFormField<T>` and `SliverFormFieldState<T>`. The new state overrides `wrapWithSemantics` to use `SliverSemantics`, and overrides `wrapWithFocus` to disable `Focus.includeSemantics` (the sliver-side semantics are already published by `SliverSemantics`). This mirrors the framework's existing `Foo`/`SliverFoo` split (`Padding`/`SliverPadding`, `Opacity`/`SliverOpacity`, etc.). Adds three regression tests covering: sliver builder no longer crashes, the validation-result semantics toggles between valid/invalid as the field validates, and `autovalidateMode.onUnfocus` does not crash with a sliver child. Fixes flutter#173912
…mantics getters Reduces duplication between FormFieldState and SliverFormFieldState so the latter only overrides a single bool getter and wrapWithSemantics, instead of redeclaring the entire Focus configuration.
14e751e to
c6302a9
Compare
victorsanni
left a comment
There was a problem hiding this comment.
Thanks for the PR. Are there other places we can cross-reference these new APIs for discoverability? I'm thinking API docs, "See also" sections etc.
|
Good point on discoverability, @victorsanni. In de97c4d I added |
Roll Flutter from 15d8908addf6 to e8dca90ec9e0 (58 revisions) flutter/flutter@15d8908...e8dca90 2026-08-27 [email protected] Terminate existing process before launching with devicectl (flutter/flutter#191885) 2026-08-27 [email protected] Roll Fuchsia Linux SDK from qjOQi-zAgu_tADorh... to dDxH8G5cDBP602eyG... (flutter/flutter#191889) 2026-08-27 [email protected] [flutter_tools] Verify native assets tree-shaking during linking (flutter/flutter#191637) 2026-08-27 [email protected] Denylists b-series powervr from vulkan (flutter/flutter#191808) 2026-08-27 [email protected] Handle linear and radial gradients in UberSDF (flutter/flutter#190874) 2026-08-27 [email protected] Roll Packages from 740f093 to bd3cbc1 (7 revisions) (flutter/flutter#191886) 2026-08-27 [email protected] Disable more Windows tests that have been causing CI flakes (flutter/flutter#191822) 2026-08-27 [email protected] Roll Skia from d32721369bd8 to 82e972ea84b1 (2 revisions) (flutter/flutter#191880) 2026-08-27 [email protected] Roll Skia from 3640b8edd16c to d32721369bd8 (10 revisions) (flutter/flutter#191858) 2026-08-27 [email protected] Revert: [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191863) 2026-08-27 [email protected] Roll Fuchsia Test Scripts from 0iCv10IlKfiilEBOU... to 6SXRz6wsA2Zm_rAqP... (flutter/flutter#191852) 2026-08-27 [email protected] Roll pub packages (flutter/flutter#191851) 2026-08-27 [email protected] Refactor FormField build wrappers (flutter/flutter#185795) 2026-08-27 [email protected] Make ScrollPhysics reactive by introducing shouldUpdate (flutter/flutter#189664) 2026-08-27 [email protected] macOS: Fix crash on out-of-bounds text input ranges (flutter/flutter#191780) 2026-08-27 [email protected] Add HCPP feature flag, and turn it on by default in beta/master (flutter/flutter#190623) 2026-08-27 [email protected] [tool] Migrate CleanCommand to modular dependency injection (flutter/flutter#190742) 2026-08-26 [email protected] Update triage docs for ecosystem and codelab changes (flutter/flutter#191809) 2026-08-26 [email protected] [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191824) 2026-08-26 [email protected] [UIScene] Migrate dev/benchmarks/complex_layout to UIScene lifecycle (flutter/flutter#191619) 2026-08-26 [email protected] Add SliverAppBar showOnScreen semantics test coverage (flutter/flutter#190410) 2026-08-26 [email protected] Add prompt_suggestion icon to list of RTL mirroring icons. (flutter/flutter#191741) 2026-08-26 [email protected] Remove bringup for batch 3 (flutter/flutter#191750) 2026-08-26 [email protected] Roll Skia from b5465d7b0b77 to 3640b8edd16c (6 revisions) (flutter/flutter#191835) 2026-08-26 [email protected] Uiscene migrate custom channels views (flutter/flutter#191817) 2026-08-26 [email protected] Support --[no-]adb-log-filtering CLI option (flutter/flutter#187252) 2026-08-26 [email protected] Roll Dart SDK from cb8a4e1a0fbb to cb4c39d067f3 (2 revisions) (flutter/flutter#191825) 2026-08-26 [email protected] Fix `Navigator.pushNamed<T>()` type checking (flutter/flutter#188148) 2026-08-26 [email protected] Handle the case where a window doesn't have a title set (flutter/flutter#191767) 2026-08-26 [email protected] [Android] Remove old `InputType` constructor from embedding (flutter/flutter#191244) 2026-08-26 [email protected] Roll Skia from 244a6a0f8f92 to b5465d7b0b77 (19 revisions) (flutter/flutter#191810) 2026-08-26 [email protected] Tolerate floating-point rounding in paintImage centerSlice assertion (flutter/flutter#185789) 2026-08-26 [email protected] Fixes translated bounded blurs (flutter/flutter#191615) 2026-08-26 [email protected] Roll Fuchsia Linux SDK from MstTWE1RDOT-RnrtH... to qjOQi-zAgu_tADorh... (flutter/flutter#191769) 2026-08-26 [email protected] Lerp HSVColor and HSLColor hue along the shortest arc (flutter/flutter#191186) 2026-08-26 [email protected] Fix enum instances comparison to use `equality ==` since dart has the correct behavior now (flutter/flutter#191537) 2026-08-26 [email protected] Switches windows to opengles 3 (flutter/flutter#191516) 2026-08-26 [email protected] Roll Dart SDK from 7739e8602bc1 to cb8a4e1a0fbb (1 revision) (flutter/flutter#191784) 2026-08-26 [email protected] iOS,macOS: Check viewType before creating a platform view (flutter/flutter#191777) 2026-08-26 [email protected] Revert: [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191793) 2026-08-26 [email protected] refactor(flutter_tools): clean up dead unreferenced declarations (flutter/flutter#191163) 2026-08-26 [email protected] Roll Fuchsia GN SDK from a87CbQSWEjkPUK1ZY... to ZsxUUK2SfA-TrNvb8... (flutter/flutter#191763) 2026-08-26 [email protected] [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191732) 2026-08-25 [email protected] Remove legacy gen_defaults analyze checks (flutter/flutter#191629) 2026-08-25 [email protected] Refactors `try` to avoid `unawaited_return_in_try_block` case (flutter/flutter#191129) 2026-08-25 [email protected] Roll Dart SDK from 8996935d3d0a to 7739e8602bc1 (1 revision) (flutter/flutter#191754) ...
…r#12660) Roll Flutter from 15d8908addf6 to e8dca90ec9e0 (58 revisions) flutter/flutter@15d8908...e8dca90 2026-08-27 [email protected] Terminate existing process before launching with devicectl (flutter/flutter#191885) 2026-08-27 [email protected] Roll Fuchsia Linux SDK from qjOQi-zAgu_tADorh... to dDxH8G5cDBP602eyG... (flutter/flutter#191889) 2026-08-27 [email protected] [flutter_tools] Verify native assets tree-shaking during linking (flutter/flutter#191637) 2026-08-27 [email protected] Denylists b-series powervr from vulkan (flutter/flutter#191808) 2026-08-27 [email protected] Handle linear and radial gradients in UberSDF (flutter/flutter#190874) 2026-08-27 [email protected] Roll Packages from 740f093 to bd3cbc1 (7 revisions) (flutter/flutter#191886) 2026-08-27 [email protected] Disable more Windows tests that have been causing CI flakes (flutter/flutter#191822) 2026-08-27 [email protected] Roll Skia from d32721369bd8 to 82e972ea84b1 (2 revisions) (flutter/flutter#191880) 2026-08-27 [email protected] Roll Skia from 3640b8edd16c to d32721369bd8 (10 revisions) (flutter/flutter#191858) 2026-08-27 [email protected] Revert: [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191863) 2026-08-27 [email protected] Roll Fuchsia Test Scripts from 0iCv10IlKfiilEBOU... to 6SXRz6wsA2Zm_rAqP... (flutter/flutter#191852) 2026-08-27 [email protected] Roll pub packages (flutter/flutter#191851) 2026-08-27 [email protected] Refactor FormField build wrappers (flutter/flutter#185795) 2026-08-27 [email protected] Make ScrollPhysics reactive by introducing shouldUpdate (flutter/flutter#189664) 2026-08-27 [email protected] macOS: Fix crash on out-of-bounds text input ranges (flutter/flutter#191780) 2026-08-27 [email protected] Add HCPP feature flag, and turn it on by default in beta/master (flutter/flutter#190623) 2026-08-27 [email protected] [tool] Migrate CleanCommand to modular dependency injection (flutter/flutter#190742) 2026-08-26 [email protected] Update triage docs for ecosystem and codelab changes (flutter/flutter#191809) 2026-08-26 [email protected] [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191824) 2026-08-26 [email protected] [UIScene] Migrate dev/benchmarks/complex_layout to UIScene lifecycle (flutter/flutter#191619) 2026-08-26 [email protected] Add SliverAppBar showOnScreen semantics test coverage (flutter/flutter#190410) 2026-08-26 [email protected] Add prompt_suggestion icon to list of RTL mirroring icons. (flutter/flutter#191741) 2026-08-26 [email protected] Remove bringup for batch 3 (flutter/flutter#191750) 2026-08-26 [email protected] Roll Skia from b5465d7b0b77 to 3640b8edd16c (6 revisions) (flutter/flutter#191835) 2026-08-26 [email protected] Uiscene migrate custom channels views (flutter/flutter#191817) 2026-08-26 [email protected] Support --[no-]adb-log-filtering CLI option (flutter/flutter#187252) 2026-08-26 [email protected] Roll Dart SDK from cb8a4e1a0fbb to cb4c39d067f3 (2 revisions) (flutter/flutter#191825) 2026-08-26 [email protected] Fix `Navigator.pushNamed<T>()` type checking (flutter/flutter#188148) 2026-08-26 [email protected] Handle the case where a window doesn't have a title set (flutter/flutter#191767) 2026-08-26 [email protected] [Android] Remove old `InputType` constructor from embedding (flutter/flutter#191244) 2026-08-26 [email protected] Roll Skia from 244a6a0f8f92 to b5465d7b0b77 (19 revisions) (flutter/flutter#191810) 2026-08-26 [email protected] Tolerate floating-point rounding in paintImage centerSlice assertion (flutter/flutter#185789) 2026-08-26 [email protected] Fixes translated bounded blurs (flutter/flutter#191615) 2026-08-26 [email protected] Roll Fuchsia Linux SDK from MstTWE1RDOT-RnrtH... to qjOQi-zAgu_tADorh... (flutter/flutter#191769) 2026-08-26 [email protected] Lerp HSVColor and HSLColor hue along the shortest arc (flutter/flutter#191186) 2026-08-26 [email protected] Fix enum instances comparison to use `equality ==` since dart has the correct behavior now (flutter/flutter#191537) 2026-08-26 [email protected] Switches windows to opengles 3 (flutter/flutter#191516) 2026-08-26 [email protected] Roll Dart SDK from 7739e8602bc1 to cb8a4e1a0fbb (1 revision) (flutter/flutter#191784) 2026-08-26 [email protected] iOS,macOS: Check viewType before creating a platform view (flutter/flutter#191777) 2026-08-26 [email protected] Revert: [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191793) 2026-08-26 [email protected] refactor(flutter_tools): clean up dead unreferenced declarations (flutter/flutter#191163) 2026-08-26 [email protected] Roll Fuchsia GN SDK from a87CbQSWEjkPUK1ZY... to ZsxUUK2SfA-TrNvb8... (flutter/flutter#191763) 2026-08-26 [email protected] [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191732) 2026-08-25 [email protected] Remove legacy gen_defaults analyze checks (flutter/flutter#191629) 2026-08-25 [email protected] Refactors `try` to avoid `unawaited_return_in_try_block` case (flutter/flutter#191129) 2026-08-25 [email protected] Roll Dart SDK from 8996935d3d0a to 7739e8602bc1 (1 revision) (flutter/flutter#191754) ...
…r#12660) Roll Flutter from 15d8908addf6 to e8dca90ec9e0 (58 revisions) flutter/flutter@15d8908...e8dca90 2026-08-27 [email protected] Terminate existing process before launching with devicectl (flutter/flutter#191885) 2026-08-27 [email protected] Roll Fuchsia Linux SDK from qjOQi-zAgu_tADorh... to dDxH8G5cDBP602eyG... (flutter/flutter#191889) 2026-08-27 [email protected] [flutter_tools] Verify native assets tree-shaking during linking (flutter/flutter#191637) 2026-08-27 [email protected] Denylists b-series powervr from vulkan (flutter/flutter#191808) 2026-08-27 [email protected] Handle linear and radial gradients in UberSDF (flutter/flutter#190874) 2026-08-27 [email protected] Roll Packages from 740f093 to bd3cbc1 (7 revisions) (flutter/flutter#191886) 2026-08-27 [email protected] Disable more Windows tests that have been causing CI flakes (flutter/flutter#191822) 2026-08-27 [email protected] Roll Skia from d32721369bd8 to 82e972ea84b1 (2 revisions) (flutter/flutter#191880) 2026-08-27 [email protected] Roll Skia from 3640b8edd16c to d32721369bd8 (10 revisions) (flutter/flutter#191858) 2026-08-27 [email protected] Revert: [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191863) 2026-08-27 [email protected] Roll Fuchsia Test Scripts from 0iCv10IlKfiilEBOU... to 6SXRz6wsA2Zm_rAqP... (flutter/flutter#191852) 2026-08-27 [email protected] Roll pub packages (flutter/flutter#191851) 2026-08-27 [email protected] Refactor FormField build wrappers (flutter/flutter#185795) 2026-08-27 [email protected] Make ScrollPhysics reactive by introducing shouldUpdate (flutter/flutter#189664) 2026-08-27 [email protected] macOS: Fix crash on out-of-bounds text input ranges (flutter/flutter#191780) 2026-08-27 [email protected] Add HCPP feature flag, and turn it on by default in beta/master (flutter/flutter#190623) 2026-08-27 [email protected] [tool] Migrate CleanCommand to modular dependency injection (flutter/flutter#190742) 2026-08-26 [email protected] Update triage docs for ecosystem and codelab changes (flutter/flutter#191809) 2026-08-26 [email protected] [AGP 9] Update remaining tests to AGP 9 (flutter/flutter#191824) 2026-08-26 [email protected] [UIScene] Migrate dev/benchmarks/complex_layout to UIScene lifecycle (flutter/flutter#191619) 2026-08-26 [email protected] Add SliverAppBar showOnScreen semantics test coverage (flutter/flutter#190410) 2026-08-26 [email protected] Add prompt_suggestion icon to list of RTL mirroring icons. (flutter/flutter#191741) 2026-08-26 [email protected] Remove bringup for batch 3 (flutter/flutter#191750) 2026-08-26 [email protected] Roll Skia from b5465d7b0b77 to 3640b8edd16c (6 revisions) (flutter/flutter#191835) 2026-08-26 [email protected] Uiscene migrate custom channels views (flutter/flutter#191817) 2026-08-26 [email protected] Support --[no-]adb-log-filtering CLI option (flutter/flutter#187252) 2026-08-26 [email protected] Roll Dart SDK from cb8a4e1a0fbb to cb4c39d067f3 (2 revisions) (flutter/flutter#191825) 2026-08-26 [email protected] Fix `Navigator.pushNamed<T>()` type checking (flutter/flutter#188148) 2026-08-26 [email protected] Handle the case where a window doesn't have a title set (flutter/flutter#191767) 2026-08-26 [email protected] [Android] Remove old `InputType` constructor from embedding (flutter/flutter#191244) 2026-08-26 [email protected] Roll Skia from 244a6a0f8f92 to b5465d7b0b77 (19 revisions) (flutter/flutter#191810) 2026-08-26 [email protected] Tolerate floating-point rounding in paintImage centerSlice assertion (flutter/flutter#185789) 2026-08-26 [email protected] Fixes translated bounded blurs (flutter/flutter#191615) 2026-08-26 [email protected] Roll Fuchsia Linux SDK from MstTWE1RDOT-RnrtH... to qjOQi-zAgu_tADorh... (flutter/flutter#191769) 2026-08-26 [email protected] Lerp HSVColor and HSLColor hue along the shortest arc (flutter/flutter#191186) 2026-08-26 [email protected] Fix enum instances comparison to use `equality ==` since dart has the correct behavior now (flutter/flutter#191537) 2026-08-26 [email protected] Switches windows to opengles 3 (flutter/flutter#191516) 2026-08-26 [email protected] Roll Dart SDK from 7739e8602bc1 to cb8a4e1a0fbb (1 revision) (flutter/flutter#191784) 2026-08-26 [email protected] iOS,macOS: Check viewType before creating a platform view (flutter/flutter#191777) 2026-08-26 [email protected] Revert: [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191793) 2026-08-26 [email protected] refactor(flutter_tools): clean up dead unreferenced declarations (flutter/flutter#191163) 2026-08-26 [email protected] Roll Fuchsia GN SDK from a87CbQSWEjkPUK1ZY... to ZsxUUK2SfA-TrNvb8... (flutter/flutter#191763) 2026-08-26 [email protected] [tool_tests] Remove bringup from Windows tool_tests_commands_2_2 (flutter/flutter#191732) 2026-08-25 [email protected] Remove legacy gen_defaults analyze checks (flutter/flutter#191629) 2026-08-25 [email protected] Refactors `try` to avoid `unawaited_return_in_try_block` case (flutter/flutter#191129) 2026-08-25 [email protected] Roll Dart SDK from 8996935d3d0a to 7739e8602bc1 (1 revision) (flutter/flutter#191754) ...
Summary
This is the refactor-only half of the sliver form field work.
FormFieldState.buildnow delegates its validation semantics wrapper andAutovalidateMode.onUnfocusfocus wrapper through protectedwrapWithSemanticsandwrapWithFocusmethods. The shared validation result andFocus.includeSemanticsvalue are kept behind small getters so subclasses can customize only the layout-protocol-specific pieces.There is no intended behavior change for
FormFieldor existing subclasses. The existing render-box semantics and focus behavior remain the same.Issue
Preparation for #173912. This PR does not fix the issue by itself; the sliver API can follow in a separate PR after this refactor lands.
Tests
flutter analyze --no-pub packages/flutter/lib/src/widgets/form.dart packages/flutter/test/widgets/form_test.dart packages/flutter/test/widgets/semantics_test.dart packages/flutter/test/material/text_form_field_test.dart packages/flutter/test/material/text_form_field_restoration_test.dart packages/flutter/test/material/dropdown_form_field_test.dart packages/flutter/test/material/dropdown_menu_form_field_test.dart packages/flutter/test/material/input_date_picker_form_field_test.dartflutter test packages/flutter/test/widgets/form_test.dart packages/flutter/test/widgets/semantics_test.dart packages/flutter/test/material/text_form_field_test.dart packages/flutter/test/material/text_form_field_restoration_test.dart packages/flutter/test/material/dropdown_form_field_test.dart packages/flutter/test/material/dropdown_menu_form_field_test.dart packages/flutter/test/material/input_date_picker_form_field_test.dartPre-launch Checklist