@@ -310,15 +310,12 @@ class _SearchAnchorState extends State<SearchAnchor> {
310
310
bool _anchorIsVisible = true ;
311
311
final GlobalKey _anchorKey = GlobalKey ();
312
312
bool get _viewIsOpen => ! _anchorIsVisible;
313
- late SearchController ? _internalSearchController;
314
- SearchController get _searchController => widget.searchController ?? _internalSearchController! ;
313
+ SearchController ? _internalSearchController;
314
+ SearchController get _searchController => widget.searchController ?? ( _internalSearchController ?? = SearchController ()) ;
315
315
316
316
@override
317
317
void initState () {
318
318
super .initState ();
319
- if (widget.searchController == null ) {
320
- _internalSearchController = SearchController ();
321
- }
322
319
_searchController._attach (this );
323
320
}
324
321
@@ -334,11 +331,21 @@ class _SearchAnchorState extends State<SearchAnchor> {
334
331
_screenSize = updatedScreenSize;
335
332
}
336
333
334
+ @override
335
+ void didUpdateWidget (SearchAnchor oldWidget) {
336
+ super .didUpdateWidget (oldWidget);
337
+ if (oldWidget.searchController != widget.searchController) {
338
+ oldWidget.searchController? ._detach (this );
339
+ _searchController._attach (this );
340
+ }
341
+ }
342
+
337
343
@override
338
344
void dispose () {
339
345
super .dispose ();
340
- _searchController._detach (this );
341
- _internalSearchController = null ;
346
+ widget.searchController? ._detach (this );
347
+ _internalSearchController? ._detach (this );
348
+ _internalSearchController? .dispose ();
342
349
}
343
350
344
351
void _openView () {
@@ -680,12 +687,6 @@ class _ViewContentState extends State<_ViewContent> {
680
687
}
681
688
}
682
689
683
- @override
684
- void dispose (){
685
- _controller.removeListener (updateSuggestions);
686
- super .dispose ();
687
- }
688
-
689
690
@override
690
691
void didUpdateWidget (covariant _ViewContent oldWidget) {
691
692
super .didUpdateWidget (oldWidget);
@@ -710,6 +711,13 @@ class _ViewContentState extends State<_ViewContent> {
710
711
unawaited (updateSuggestions ());
711
712
}
712
713
714
+ @override
715
+ void dispose () {
716
+ _controller.removeListener (updateSuggestions);
717
+ _focusNode.dispose ();
718
+ super .dispose ();
719
+ }
720
+
713
721
Widget viewBuilder (Iterable <Widget > suggestions) {
714
722
if (widget.viewBuilder == null ) {
715
723
return MediaQuery .removePadding (
@@ -949,15 +957,18 @@ class SearchController extends TextEditingController {
949
957
// it controls.
950
958
_SearchAnchorState ? _anchor;
951
959
960
+ /// Whether this controller has associated search anchor.
961
+ bool get isAttached => _anchor != null ;
962
+
952
963
/// Whether or not the associated search view is currently open.
953
964
bool get isOpen {
954
- assert (_anchor != null );
965
+ assert (isAttached );
955
966
return _anchor! ._viewIsOpen;
956
967
}
957
968
958
969
/// Opens the search view that this controller is associated with.
959
970
void openView () {
960
- assert (_anchor != null );
971
+ assert (isAttached );
961
972
_anchor! ._openView ();
962
973
}
963
974
@@ -966,7 +977,7 @@ class SearchController extends TextEditingController {
966
977
/// If `selectedText` is given, then the text value of the controller is set to
967
978
/// `selectedText` .
968
979
void closeView (String ? selectedText) {
969
- assert (_anchor != null );
980
+ assert (isAttached );
970
981
_anchor! ._closeView (selectedText);
971
982
}
972
983
@@ -1166,7 +1177,8 @@ class SearchBar extends StatefulWidget {
1166
1177
1167
1178
class _SearchBarState extends State <SearchBar > {
1168
1179
late final MaterialStatesController _internalStatesController;
1169
- late final FocusNode _focusNode;
1180
+ FocusNode ? _internalFocusNode;
1181
+ FocusNode get _focusNode => widget.focusNode ?? (_internalFocusNode ?? = FocusNode ());
1170
1182
1171
1183
@override
1172
1184
void initState () {
@@ -1175,15 +1187,12 @@ class _SearchBarState extends State<SearchBar> {
1175
1187
_internalStatesController.addListener (() {
1176
1188
setState (() {});
1177
1189
});
1178
- _focusNode = widget.focusNode ?? FocusNode ();
1179
1190
}
1180
1191
1181
1192
@override
1182
1193
void dispose () {
1183
1194
_internalStatesController.dispose ();
1184
- if (widget.focusNode == null ) {
1185
- _focusNode.dispose ();
1186
- }
1195
+ _internalFocusNode? .dispose ();
1187
1196
super .dispose ();
1188
1197
}
1189
1198
0 commit comments