@@ -6,9 +6,10 @@ import 'package:flutter/material.dart';
6
6
import 'package:flutter/rendering.dart' ;
7
7
import 'package:flutter/services.dart' ;
8
8
import 'package:flutter_test/flutter_test.dart' ;
9
+ import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart' ;
9
10
10
11
void main () {
11
- testWidgets ('onSaved callback is called' , (WidgetTester tester) async {
12
+ testWidgetsWithLeakTracking ('onSaved callback is called' , (WidgetTester tester) async {
12
13
final GlobalKey <FormState > formKey = GlobalKey <FormState >();
13
14
String ? fieldValue;
14
15
@@ -48,7 +49,7 @@ void main() {
48
49
await checkText ('' );
49
50
});
50
51
51
- testWidgets ('onChanged callback is called' , (WidgetTester tester) async {
52
+ testWidgetsWithLeakTracking ('onChanged callback is called' , (WidgetTester tester) async {
52
53
String ? fieldValue;
53
54
54
55
Widget builder () {
@@ -85,7 +86,7 @@ void main() {
85
86
await checkText ('' );
86
87
});
87
88
88
- testWidgets ('Validator sets the error text only when validate is called' , (WidgetTester tester) async {
89
+ testWidgetsWithLeakTracking ('Validator sets the error text only when validate is called' , (WidgetTester tester) async {
89
90
final GlobalKey <FormState > formKey = GlobalKey <FormState >();
90
91
String ? errorText (String ? value) => '${value ?? '' }/error' ;
91
92
@@ -139,7 +140,7 @@ void main() {
139
140
await checkErrorText ('' );
140
141
});
141
142
142
- testWidgets ('Should announce error text when validate returns error' , (WidgetTester tester) async {
143
+ testWidgetsWithLeakTracking ('Should announce error text when validate returns error' , (WidgetTester tester) async {
143
144
final GlobalKey <FormState > formKey = GlobalKey <FormState >();
144
145
await tester.pumpWidget (
145
146
MaterialApp (
@@ -178,7 +179,7 @@ void main() {
178
179
179
180
});
180
181
181
- testWidgets ('isValid returns true when a field is valid' , (WidgetTester tester) async {
182
+ testWidgetsWithLeakTracking ('isValid returns true when a field is valid' , (WidgetTester tester) async {
182
183
final GlobalKey <FormFieldState <String >> fieldKey1 = GlobalKey <FormFieldState <String >>();
183
184
final GlobalKey <FormFieldState <String >> fieldKey2 = GlobalKey <FormFieldState <String >>();
184
185
const String validString = 'Valid string' ;
@@ -223,7 +224,7 @@ void main() {
223
224
expect (fieldKey2.currentState! .isValid, isTrue);
224
225
});
225
226
226
- testWidgets (
227
+ testWidgetsWithLeakTracking (
227
228
'isValid returns false when the field is invalid and does not change error display' ,
228
229
(WidgetTester tester) async {
229
230
final GlobalKey <FormFieldState <String >> fieldKey1 = GlobalKey <FormFieldState <String >>();
@@ -272,7 +273,7 @@ void main() {
272
273
},
273
274
);
274
275
275
- testWidgets ('Multiple TextFormFields communicate' , (WidgetTester tester) async {
276
+ testWidgetsWithLeakTracking ('Multiple TextFormFields communicate' , (WidgetTester tester) async {
276
277
final GlobalKey <FormState > formKey = GlobalKey <FormState >();
277
278
final GlobalKey <FormFieldState <String >> fieldKey = GlobalKey <FormFieldState <String >>();
278
279
// Input 2's validator depends on a input 1's value.
@@ -322,7 +323,7 @@ void main() {
322
323
await checkErrorText ('' );
323
324
});
324
325
325
- testWidgets ('Provide initial value to input when no controller is specified' , (WidgetTester tester) async {
326
+ testWidgetsWithLeakTracking ('Provide initial value to input when no controller is specified' , (WidgetTester tester) async {
326
327
const String initialValue = 'hello' ;
327
328
final GlobalKey <FormFieldState <String >> inputKey = GlobalKey <FormFieldState <String >>();
328
329
@@ -366,8 +367,9 @@ void main() {
366
367
expect (editableText.widget.controller.text, equals ('world' ));
367
368
});
368
369
369
- testWidgets ('Controller defines initial value' , (WidgetTester tester) async {
370
+ testWidgetsWithLeakTracking ('Controller defines initial value' , (WidgetTester tester) async {
370
371
final TextEditingController controller = TextEditingController (text: 'hello' );
372
+ addTearDown (controller.dispose);
371
373
const String initialValue = 'hello' ;
372
374
final GlobalKey <FormFieldState <String >> inputKey = GlobalKey <FormFieldState <String >>();
373
375
@@ -413,10 +415,11 @@ void main() {
413
415
expect (controller.text, equals ('world' ));
414
416
});
415
417
416
- testWidgets ('TextFormField resets to its initial value' , (WidgetTester tester) async {
418
+ testWidgetsWithLeakTracking ('TextFormField resets to its initial value' , (WidgetTester tester) async {
417
419
final GlobalKey <FormState > formKey = GlobalKey <FormState >();
418
420
final GlobalKey <FormFieldState <String >> inputKey = GlobalKey <FormFieldState <String >>();
419
421
final TextEditingController controller = TextEditingController (text: 'Plover' );
422
+ addTearDown (controller.dispose);
420
423
421
424
Widget builder () {
422
425
return MaterialApp (
@@ -459,9 +462,11 @@ void main() {
459
462
expect (controller.text, equals ('Plover' ));
460
463
});
461
464
462
- testWidgets ('TextEditingController updates to/from form field value' , (WidgetTester tester) async {
465
+ testWidgetsWithLeakTracking ('TextEditingController updates to/from form field value' , (WidgetTester tester) async {
463
466
final TextEditingController controller1 = TextEditingController (text: 'Foo' );
467
+ addTearDown (controller1.dispose);
464
468
final TextEditingController controller2 = TextEditingController (text: 'Bar' );
469
+ addTearDown (controller2.dispose);
465
470
final GlobalKey <FormFieldState <String >> inputKey = GlobalKey <FormFieldState <String >>();
466
471
467
472
TextEditingController ? currentController;
@@ -566,7 +571,7 @@ void main() {
566
571
expect (controller2.text, equals ('Xyzzy' ));
567
572
});
568
573
569
- testWidgets ('No crash when a TextFormField is removed from the tree' , (WidgetTester tester) async {
574
+ testWidgetsWithLeakTracking ('No crash when a TextFormField is removed from the tree' , (WidgetTester tester) async {
570
575
final GlobalKey <FormState > formKey = GlobalKey <FormState >();
571
576
String ? fieldValue;
572
577
@@ -620,7 +625,7 @@ void main() {
620
625
expect (formKey.currentState! .validate (), isTrue);
621
626
});
622
627
623
- testWidgets ('Does not auto-validate before value changes when autovalidateMode is set to onUserInteraction' , (WidgetTester tester) async {
628
+ testWidgetsWithLeakTracking ('Does not auto-validate before value changes when autovalidateMode is set to onUserInteraction' , (WidgetTester tester) async {
624
629
late FormFieldState <String > formFieldState;
625
630
626
631
String ? errorText (String ? value) => '$value /error' ;
@@ -656,7 +661,7 @@ void main() {
656
661
expect (find.text (errorText ('foo' )! ), findsNothing);
657
662
});
658
663
659
- testWidgets ('auto-validate before value changes if autovalidateMode was set to always' , (WidgetTester tester) async {
664
+ testWidgetsWithLeakTracking ('auto-validate before value changes if autovalidateMode was set to always' , (WidgetTester tester) async {
660
665
late FormFieldState <String > formFieldState;
661
666
662
667
String ? errorText (String ? value) => '$value /error' ;
@@ -689,7 +694,7 @@ void main() {
689
694
expect (formFieldState.hasError, isTrue);
690
695
});
691
696
692
- testWidgets ('Form auto-validates form fields only after one of them changes if autovalidateMode is onUserInteraction' , (WidgetTester tester) async {
697
+ testWidgetsWithLeakTracking ('Form auto-validates form fields only after one of them changes if autovalidateMode is onUserInteraction' , (WidgetTester tester) async {
693
698
const String initialValue = 'foo' ;
694
699
String ? errorText (String ? value) => 'error/$value ' ;
695
700
@@ -743,7 +748,7 @@ void main() {
743
748
expect (find.text (errorText (initialValue)! ), findsNWidgets (2 ));
744
749
});
745
750
746
- testWidgets ('Form auto-validates form fields even before any have changed if autovalidateMode is set to always' , (WidgetTester tester) async {
751
+ testWidgetsWithLeakTracking ('Form auto-validates form fields even before any have changed if autovalidateMode is set to always' , (WidgetTester tester) async {
747
752
String ? errorText (String ? value) => 'error/$value ' ;
748
753
749
754
Widget builder () {
@@ -773,7 +778,7 @@ void main() {
773
778
expect (find.text (errorText ('' )! ), findsOneWidget);
774
779
});
775
780
776
- testWidgets ('Form.reset() resets form fields, and auto validation will only happen on the next user interaction if autovalidateMode is onUserInteraction' , (WidgetTester tester) async {
781
+ testWidgetsWithLeakTracking ('Form.reset() resets form fields, and auto validation will only happen on the next user interaction if autovalidateMode is onUserInteraction' , (WidgetTester tester) async {
777
782
final GlobalKey <FormState > formState = GlobalKey <FormState >();
778
783
String ? errorText (String ? value) => '$value /error' ;
779
784
@@ -818,7 +823,7 @@ void main() {
818
823
});
819
824
820
825
// Regression test for https://github.com/flutter/flutter/issues/63753.
821
- testWidgets ('Validate form should return correct validation if the value is composing' , (WidgetTester tester) async {
826
+ testWidgetsWithLeakTracking ('Validate form should return correct validation if the value is composing' , (WidgetTester tester) async {
822
827
final GlobalKey <FormState > formKey = GlobalKey <FormState >();
823
828
String ? fieldValue;
824
829
@@ -855,7 +860,7 @@ void main() {
855
860
expect (formKey.currentState! .validate (), isFalse);
856
861
});
857
862
858
- testWidgets ('hasInteractedByUser returns false when the input has not changed' , (WidgetTester tester) async {
863
+ testWidgetsWithLeakTracking ('hasInteractedByUser returns false when the input has not changed' , (WidgetTester tester) async {
859
864
final GlobalKey <FormFieldState <String >> fieldKey = GlobalKey <FormFieldState <String >>();
860
865
861
866
final Widget widget = MaterialApp (
@@ -879,7 +884,7 @@ void main() {
879
884
expect (fieldKey.currentState! .hasInteractedByUser, isFalse);
880
885
});
881
886
882
- testWidgets ('hasInteractedByUser returns true after the input has changed' , (WidgetTester tester) async {
887
+ testWidgetsWithLeakTracking ('hasInteractedByUser returns true after the input has changed' , (WidgetTester tester) async {
883
888
final GlobalKey <FormFieldState <String >> fieldKey = GlobalKey <FormFieldState <String >>();
884
889
885
890
final Widget widget = MaterialApp (
@@ -908,7 +913,7 @@ void main() {
908
913
expect (fieldKey.currentState! .hasInteractedByUser, isTrue);
909
914
});
910
915
911
- testWidgets ('hasInteractedByUser returns false after the field is reset' , (WidgetTester tester) async {
916
+ testWidgetsWithLeakTracking ('hasInteractedByUser returns false after the field is reset' , (WidgetTester tester) async {
912
917
final GlobalKey <FormFieldState <String >> fieldKey = GlobalKey <FormFieldState <String >>();
913
918
914
919
final Widget widget = MaterialApp (
0 commit comments