From e78754267ba14ebc529ddd21789e87a4d596b3e5 Mon Sep 17 00:00:00 2001 From: foxmind1 Date: Wed, 30 Apr 2025 21:44:36 +0300 Subject: [PATCH] add onReset callback to FormField (#167060) This PR adds onReset callback to FormField fixes #167057 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --- packages/flutter/lib/src/widgets/form.dart | 6 +++++ packages/flutter/test/widgets/form_test.dart | 26 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/packages/flutter/lib/src/widgets/form.dart b/packages/flutter/lib/src/widgets/form.dart index a0f28e8798e..7a8a29be5e1 100644 --- a/packages/flutter/lib/src/widgets/form.dart +++ b/packages/flutter/lib/src/widgets/form.dart @@ -466,6 +466,7 @@ class FormField extends StatefulWidget { super.key, required this.builder, this.onSaved, + this.onReset, this.forceErrorText, this.validator, this.errorBuilder, @@ -485,6 +486,10 @@ class FormField extends StatefulWidget { /// [FormState.save]. final FormFieldSetter? onSaved; + /// An optional method to call when the form field is reset via + /// [FormFieldState.reset]. + final VoidCallback? onReset; + /// An optional property that forces the [FormFieldState] into an error state /// by directly setting the [FormFieldState.errorText] property without /// running the validator function. @@ -631,6 +636,7 @@ class FormFieldState extends State> with RestorationMixin { _hasInteractedByUser.value = false; _errorText.value = null; }); + widget.onReset?.call(); Form.maybeOf(context)?._fieldDidChange(); } diff --git a/packages/flutter/test/widgets/form_test.dart b/packages/flutter/test/widgets/form_test.dart index 3a47aaea98a..cedc183c4b7 100644 --- a/packages/flutter/test/widgets/form_test.dart +++ b/packages/flutter/test/widgets/form_test.dart @@ -89,6 +89,32 @@ void main() { await checkText(''); }); + testWidgets('onReset callback is called', (WidgetTester tester) async { + final GlobalKey formKey = GlobalKey(); + bool resetCalled = false; + + await tester.pumpWidget( + MaterialApp( + home: Form( + key: formKey, + child: FormField( + builder: (_) => const SizedBox.shrink(), + onReset: () { + resetCalled = true; + }, + ), + ), + ), + ); + + expect(resetCalled, isFalse); + + formKey.currentState!.reset(); + await tester.pump(); + + expect(resetCalled, isTrue); + }); + testWidgets('Validator sets the error text only when validate is called', ( WidgetTester tester, ) async {