@@ -48,8 +48,9 @@ void main() {
48
48
);
49
49
});
50
50
51
- testWidgets ('Can open and close search' , (WidgetTester tester) async {
51
+ testWidgetsWithLeakTracking ('Can open and close search' , (WidgetTester tester) async {
52
52
final _TestSearchDelegate delegate = _TestSearchDelegate ();
53
+ addTearDown (() => delegate.dispose ());
53
54
final List <String > selectedResults = < String > [];
54
55
55
56
await tester.pumpWidget (TestHomePage (
@@ -84,10 +85,11 @@ void main() {
84
85
expect (selectedResults, < String > ['Result' ]);
85
86
});
86
87
87
- testWidgets ('Can close search with system back button to return null' , (WidgetTester tester) async {
88
+ testWidgetsWithLeakTracking ('Can close search with system back button to return null' , (WidgetTester tester) async {
88
89
// regression test for https://github.com/flutter/flutter/issues/18145
89
90
90
91
final _TestSearchDelegate delegate = _TestSearchDelegate ();
92
+ addTearDown (() => delegate.dispose ());
91
93
final List <String ?> selectedResults = < String ? > [];
92
94
93
95
await tester.pumpWidget (TestHomePage (
@@ -130,9 +132,10 @@ void main() {
130
132
expect (find.text ('Suggestions' ), findsOneWidget);
131
133
});
132
134
133
- testWidgets ('Hint text color overridden' , (WidgetTester tester) async {
135
+ testWidgetsWithLeakTracking ('Hint text color overridden' , (WidgetTester tester) async {
134
136
const String searchHintText = 'Enter search terms' ;
135
137
final _TestSearchDelegate delegate = _TestSearchDelegate (searchHint: searchHintText);
138
+ addTearDown (() => delegate.dispose ());
136
139
137
140
await tester.pumpWidget (TestHomePage (
138
141
delegate: delegate,
@@ -144,8 +147,9 @@ void main() {
144
147
expect (hintText.style! .color, _TestSearchDelegate .hintTextColor);
145
148
});
146
149
147
- testWidgets ('Requests suggestions' , (WidgetTester tester) async {
150
+ testWidgetsWithLeakTracking ('Requests suggestions' , (WidgetTester tester) async {
148
151
final _TestSearchDelegate delegate = _TestSearchDelegate ();
152
+ addTearDown (() => delegate.dispose ());
149
153
150
154
await tester.pumpWidget (TestHomePage (
151
155
delegate: delegate,
@@ -173,8 +177,9 @@ void main() {
173
177
expect (delegate.queriesForResults, hasLength (0 ));
174
178
});
175
179
176
- testWidgets ('Shows Results and closes search' , (WidgetTester tester) async {
180
+ testWidgetsWithLeakTracking ('Shows Results and closes search' , (WidgetTester tester) async {
177
181
final _TestSearchDelegate delegate = _TestSearchDelegate ();
182
+ addTearDown (() => delegate.dispose ());
178
183
final List <String > selectedResults = < String > [];
179
184
180
185
await tester.pumpWidget (TestHomePage (
@@ -209,8 +214,9 @@ void main() {
209
214
expect (selectedResults, < String > ['Result' ]);
210
215
});
211
216
212
- testWidgets ('Can switch between results and suggestions' , (WidgetTester tester) async {
217
+ testWidgetsWithLeakTracking ('Can switch between results and suggestions' , (WidgetTester tester) async {
213
218
final _TestSearchDelegate delegate = _TestSearchDelegate ();
219
+ addTearDown (() => delegate.dispose ());
214
220
215
221
await tester.pumpWidget (TestHomePage (
216
222
delegate: delegate,
@@ -279,8 +285,9 @@ void main() {
279
285
expect (textField.focusNode! .hasFocus, isFalse);
280
286
});
281
287
282
- testWidgets ('Fresh search always starts with empty query' , (WidgetTester tester) async {
288
+ testWidgetsWithLeakTracking ('Fresh search always starts with empty query' , (WidgetTester tester) async {
283
289
final _TestSearchDelegate delegate = _TestSearchDelegate ();
290
+ addTearDown (() => delegate.dispose ());
284
291
285
292
await tester.pumpWidget (TestHomePage (
286
293
delegate: delegate,
@@ -299,8 +306,9 @@ void main() {
299
306
expect (delegate.query, '' );
300
307
});
301
308
302
- testWidgets ('Initial queries are honored' , (WidgetTester tester) async {
309
+ testWidgetsWithLeakTracking ('Initial queries are honored' , (WidgetTester tester) async {
303
310
final _TestSearchDelegate delegate = _TestSearchDelegate ();
311
+ addTearDown (() => delegate.dispose ());
304
312
305
313
expect (delegate.query, '' );
306
314
@@ -315,8 +323,9 @@ void main() {
315
323
expect (delegate.query, 'Foo' );
316
324
});
317
325
318
- testWidgets ('Initial query null re-used previous query' , (WidgetTester tester) async {
326
+ testWidgetsWithLeakTracking ('Initial query null re-used previous query' , (WidgetTester tester) async {
319
327
final _TestSearchDelegate delegate = _TestSearchDelegate ();
328
+ addTearDown (() => delegate.dispose ());
320
329
321
330
delegate.query = 'Foo' ;
322
331
@@ -330,8 +339,9 @@ void main() {
330
339
expect (delegate.query, 'Foo' );
331
340
});
332
341
333
- testWidgets ('Changing query shows up in search field' , (WidgetTester tester) async {
342
+ testWidgetsWithLeakTracking ('Changing query shows up in search field' , (WidgetTester tester) async {
334
343
final _TestSearchDelegate delegate = _TestSearchDelegate ();
344
+ addTearDown (() => delegate.dispose ());
335
345
336
346
await tester.pumpWidget (TestHomePage (
337
347
delegate: delegate,
@@ -351,8 +361,9 @@ void main() {
351
361
expect (find.text ('Bar' ), findsOneWidget);
352
362
});
353
363
354
- testWidgets ('transitionAnimation runs while search fades in/out' , (WidgetTester tester) async {
364
+ testWidgetsWithLeakTracking ('transitionAnimation runs while search fades in/out' , (WidgetTester tester) async {
355
365
final _TestSearchDelegate delegate = _TestSearchDelegate ();
366
+ addTearDown (() => delegate.dispose ());
356
367
357
368
await tester.pumpWidget (TestHomePage (
358
369
delegate: delegate,
@@ -379,12 +390,13 @@ void main() {
379
390
expect (delegate.transitionAnimation.status, AnimationStatus .dismissed);
380
391
});
381
392
382
- testWidgets ('Closing nested search returns to search' , (WidgetTester tester) async {
393
+ testWidgetsWithLeakTracking ('Closing nested search returns to search' , (WidgetTester tester) async {
383
394
final List <String ?> nestedSearchResults = < String ? > [];
384
395
final _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate (
385
396
suggestions: 'Nested Suggestions' ,
386
397
result: 'Nested Result' ,
387
398
);
399
+ addTearDown (nestedSearchDelegate.dispose);
388
400
389
401
final List <String > selectedResults = < String > [];
390
402
final _TestSearchDelegate delegate = _TestSearchDelegate (
@@ -406,6 +418,7 @@ void main() {
406
418
),
407
419
],
408
420
);
421
+ addTearDown (() => delegate.dispose ());
409
422
410
423
await tester.pumpWidget (TestHomePage (
411
424
delegate: delegate,
@@ -443,8 +456,9 @@ void main() {
443
456
expect (selectedResults, < String > ['Result' ]);
444
457
});
445
458
446
- testWidgets ('Closing search with nested search shown goes back to underlying route' , (WidgetTester tester) async {
459
+ testWidgetsWithLeakTracking ('Closing search with nested search shown goes back to underlying route' , (WidgetTester tester) async {
447
460
late _TestSearchDelegate delegate;
461
+ addTearDown (() => delegate.dispose ());
448
462
final List <String ?> nestedSearchResults = < String ? > [];
449
463
final _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate (
450
464
suggestions: 'Nested Suggestions' ,
@@ -463,6 +477,7 @@ void main() {
463
477
),
464
478
],
465
479
);
480
+ addTearDown (nestedSearchDelegate.dispose);
466
481
467
482
final List <String > selectedResults = < String > [];
468
483
delegate = _TestSearchDelegate (
@@ -515,11 +530,12 @@ void main() {
515
530
expect (selectedResults, < String > ['Result Foo' ]);
516
531
});
517
532
518
- testWidgets ('Custom searchFieldLabel value' , (WidgetTester tester) async {
533
+ testWidgetsWithLeakTracking ('Custom searchFieldLabel value' , (WidgetTester tester) async {
519
534
const String searchHint = 'custom search hint' ;
520
535
final String defaultSearchHint = const DefaultMaterialLocalizations ().searchFieldLabel;
521
536
522
537
final _TestSearchDelegate delegate = _TestSearchDelegate (searchHint: searchHint);
538
+ addTearDown (() => delegate.dispose ());
523
539
524
540
await tester.pumpWidget (TestHomePage (
525
541
delegate: delegate,
@@ -531,10 +547,11 @@ void main() {
531
547
expect (find.text (defaultSearchHint), findsNothing);
532
548
});
533
549
534
- testWidgets ('Default searchFieldLabel is used when it is set to null' , (WidgetTester tester) async {
550
+ testWidgetsWithLeakTracking ('Default searchFieldLabel is used when it is set to null' , (WidgetTester tester) async {
535
551
final String searchHint = const DefaultMaterialLocalizations ().searchFieldLabel;
536
552
537
553
final _TestSearchDelegate delegate = _TestSearchDelegate ();
554
+ addTearDown (() => delegate.dispose ());
538
555
539
556
await tester.pumpWidget (TestHomePage (
540
557
delegate: delegate,
@@ -545,11 +562,12 @@ void main() {
545
562
expect (find.text (searchHint), findsOneWidget);
546
563
});
547
564
548
- testWidgets ('Custom searchFieldStyle value' , (WidgetTester tester) async {
565
+ testWidgetsWithLeakTracking ('Custom searchFieldStyle value' , (WidgetTester tester) async {
549
566
const String searchHintText = 'Enter search terms' ;
550
567
const TextStyle searchFieldStyle = TextStyle (color: Colors .red, fontSize: 3 );
551
568
552
569
final _TestSearchDelegate delegate = _TestSearchDelegate (searchHint: searchHintText, searchFieldStyle: searchFieldStyle);
570
+ addTearDown (() => delegate.dispose ());
553
571
554
572
await tester.pumpWidget (TestHomePage (delegate: delegate));
555
573
await tester.tap (find.byTooltip ('Search' ));
@@ -565,8 +583,9 @@ void main() {
565
583
566
584
});
567
585
568
- testWidgets ('keyboard show search button by default' , (WidgetTester tester) async {
586
+ testWidgetsWithLeakTracking ('keyboard show search button by default' , (WidgetTester tester) async {
569
587
final _TestSearchDelegate delegate = _TestSearchDelegate ();
588
+ addTearDown (() => delegate.dispose ());
570
589
571
590
await tester.pumpWidget (TestHomePage (
572
591
delegate: delegate,
@@ -579,8 +598,9 @@ void main() {
579
598
expect (tester.testTextInput.setClientArgs! ['inputAction' ], TextInputAction .search.toString ());
580
599
});
581
600
582
- testWidgets ('Custom textInputAction results in keyboard with corresponding button' , (WidgetTester tester) async {
601
+ testWidgetsWithLeakTracking ('Custom textInputAction results in keyboard with corresponding button' , (WidgetTester tester) async {
583
602
final _TestSearchDelegate delegate = _TestSearchDelegate (textInputAction: TextInputAction .done);
603
+ addTearDown (() => delegate.dispose ());
584
604
585
605
await tester.pumpWidget (TestHomePage (
586
606
delegate: delegate,
@@ -591,9 +611,10 @@ void main() {
591
611
expect (tester.testTextInput.setClientArgs! ['inputAction' ], TextInputAction .done.toString ());
592
612
});
593
613
594
- testWidgets ('Custom flexibleSpace value' , (WidgetTester tester) async {
614
+ testWidgetsWithLeakTracking ('Custom flexibleSpace value' , (WidgetTester tester) async {
595
615
const Widget flexibleSpace = Text ('custom flexibleSpace' );
596
616
final _TestSearchDelegate delegate = _TestSearchDelegate (flexibleSpace: flexibleSpace);
617
+ addTearDown (() => delegate.dispose ());
597
618
598
619
await tester.pumpWidget (TestHomePage (delegate: delegate));
599
620
await tester.tap (find.byTooltip ('Search' ));
@@ -710,9 +731,11 @@ void main() {
710
731
);
711
732
}
712
733
713
- testWidgets ('includes routeName on Android' , (WidgetTester tester) async {
734
+ testWidgetsWithLeakTracking ('includes routeName on Android' , (WidgetTester tester) async {
714
735
final SemanticsTester semantics = SemanticsTester (tester);
715
736
final _TestSearchDelegate delegate = _TestSearchDelegate (flexibleSpace: flexibleSpace);
737
+ addTearDown (() => delegate.dispose ());
738
+
716
739
await tester.pumpWidget (TestHomePage (
717
740
delegate: delegate,
718
741
));
@@ -730,9 +753,11 @@ void main() {
730
753
semantics.dispose ();
731
754
});
732
755
733
- testWidgets ('does not include routeName' , (WidgetTester tester) async {
756
+ testWidgetsWithLeakTracking ('does not include routeName' , (WidgetTester tester) async {
734
757
final SemanticsTester semantics = SemanticsTester (tester);
735
758
final _TestSearchDelegate delegate = _TestSearchDelegate (flexibleSpace: flexibleSpace);
759
+ addTearDown (() => delegate.dispose ());
760
+
736
761
await tester.pumpWidget (TestHomePage (
737
762
delegate: delegate,
738
763
));
@@ -842,9 +867,11 @@ void main() {
842
867
);
843
868
}
844
869
845
- testWidgets ('includes routeName on Android' , (WidgetTester tester) async {
870
+ testWidgetsWithLeakTracking ('includes routeName on Android' , (WidgetTester tester) async {
846
871
final SemanticsTester semantics = SemanticsTester (tester);
847
872
final _TestSearchDelegate delegate = _TestSearchDelegate ();
873
+ addTearDown (() => delegate.dispose ());
874
+
848
875
await tester.pumpWidget (TestHomePage (
849
876
delegate: delegate,
850
877
));
@@ -862,9 +889,11 @@ void main() {
862
889
semantics.dispose ();
863
890
});
864
891
865
- testWidgets ('does not include routeName' , (WidgetTester tester) async {
892
+ testWidgetsWithLeakTracking ('does not include routeName' , (WidgetTester tester) async {
866
893
final SemanticsTester semantics = SemanticsTester (tester);
867
894
final _TestSearchDelegate delegate = _TestSearchDelegate ();
895
+ addTearDown (() => delegate.dispose ());
896
+
868
897
await tester.pumpWidget (TestHomePage (
869
898
delegate: delegate,
870
899
));
@@ -883,13 +912,14 @@ void main() {
883
912
}, variant: const TargetPlatformVariant (< TargetPlatform > { TargetPlatform .iOS, TargetPlatform .macOS }));
884
913
});
885
914
886
- testWidgets ('Custom searchFieldDecorationTheme value' , (WidgetTester tester) async {
915
+ testWidgetsWithLeakTracking ('Custom searchFieldDecorationTheme value' , (WidgetTester tester) async {
887
916
const InputDecorationTheme searchFieldDecorationTheme = InputDecorationTheme (
888
917
hintStyle: TextStyle (color: _TestSearchDelegate .hintTextColor),
889
918
);
890
919
final _TestSearchDelegate delegate = _TestSearchDelegate (
891
920
searchFieldDecorationTheme: searchFieldDecorationTheme,
892
921
);
922
+ addTearDown (() => delegate.dispose ());
893
923
894
924
await tester.pumpWidget (TestHomePage (delegate: delegate));
895
925
await tester.tap (find.byTooltip ('Search' ));
@@ -900,12 +930,12 @@ void main() {
900
930
});
901
931
902
932
// Regression test for: https://github.com/flutter/flutter/issues/66781
903
- testWidgets ('text in search bar contrasts background (light mode)' , (WidgetTester tester) async {
933
+ testWidgetsWithLeakTracking ('text in search bar contrasts background (light mode)' , (WidgetTester tester) async {
904
934
final ThemeData themeData = ThemeData (useMaterial3: false );
905
- final _TestSearchDelegate delegate = _TestSearchDelegate (
906
- defaultAppBarTheme: true ,
907
- );
935
+ final _TestSearchDelegate delegate = _TestSearchDelegate (defaultAppBarTheme: true );
936
+ addTearDown (() => delegate.dispose ());
908
937
const String query = 'search query' ;
938
+
909
939
await tester.pumpWidget (TestHomePage (
910
940
delegate: delegate,
911
941
passInInitialQuery: true ,
@@ -928,12 +958,12 @@ void main() {
928
958
});
929
959
930
960
// Regression test for: https://github.com/flutter/flutter/issues/66781
931
- testWidgets ('text in search bar contrasts background (dark mode)' , (WidgetTester tester) async {
961
+ testWidgetsWithLeakTracking ('text in search bar contrasts background (dark mode)' , (WidgetTester tester) async {
932
962
final ThemeData themeData = ThemeData .dark (useMaterial3: false );
933
- final _TestSearchDelegate delegate = _TestSearchDelegate (
934
- defaultAppBarTheme: true ,
935
- );
963
+ final _TestSearchDelegate delegate = _TestSearchDelegate (defaultAppBarTheme: true );
964
+ addTearDown (() => delegate.dispose ());
936
965
const String query = 'search query' ;
966
+
937
967
await tester.pumpWidget (TestHomePage (
938
968
delegate: delegate,
939
969
passInInitialQuery: true ,
@@ -956,10 +986,11 @@ void main() {
956
986
});
957
987
958
988
// Regression test for: https://github.com/flutter/flutter/issues/78144
959
- testWidgets ('`Leading`, `Actions` and `FlexibleSpace` nullable test' , (WidgetTester tester) async {
989
+ testWidgetsWithLeakTracking ('`Leading`, `Actions` and `FlexibleSpace` nullable test' , (WidgetTester tester) async {
960
990
// The search delegate page is displayed with no issues
961
991
// even with a null return values for [buildLeading], [buildActions] and [flexibleSpace].
962
992
final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate ();
993
+ addTearDown (delegate.dispose);
963
994
final List <String > selectedResults = < String > [];
964
995
965
996
await tester.pumpWidget (TestHomePage (
@@ -994,11 +1025,12 @@ void main() {
994
1025
expect (selectedResults, < String > ['Result' ]);
995
1026
});
996
1027
997
- testWidgets ('showSearch with useRootNavigator' , (WidgetTester tester) async {
1028
+ testWidgetsWithLeakTracking ('showSearch with useRootNavigator' , (WidgetTester tester) async {
998
1029
final _MyNavigatorObserver rootObserver = _MyNavigatorObserver ();
999
1030
final _MyNavigatorObserver localObserver = _MyNavigatorObserver ();
1000
1031
1001
1032
final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate ();
1033
+ addTearDown (delegate.dispose);
1002
1034
1003
1035
await tester.pumpWidget (MaterialApp (
1004
1036
navigatorObservers: < NavigatorObserver > [rootObserver],
@@ -1051,10 +1083,11 @@ void main() {
1051
1083
expect (localObserver.pushCount, 1 );
1052
1084
});
1053
1085
1054
- testWidgets ('Query text field shows toolbar initially' , (WidgetTester tester) async {
1086
+ testWidgetsWithLeakTracking ('Query text field shows toolbar initially' , (WidgetTester tester) async {
1055
1087
// This is a regression test for https://github.com/flutter/flutter/issues/95588
1056
1088
1057
1089
final _TestSearchDelegate delegate = _TestSearchDelegate ();
1090
+ addTearDown (() => delegate.dispose ());
1058
1091
final List <String > selectedResults = < String > [];
1059
1092
1060
1093
await tester.pumpWidget (TestHomePage (
0 commit comments