diff --git a/examples/api/lib/widgets/overlay/overlay.0.dart b/examples/api/lib/widgets/overlay/overlay.0.dart index 41a769c9e8..2a69e58f3d 100644 --- a/examples/api/lib/widgets/overlay/overlay.0.dart +++ b/examples/api/lib/widgets/overlay/overlay.0.dart @@ -138,6 +138,7 @@ class _OverlayExampleState extends State { // Remove the OverlayEntry. void removeHighlightOverlay() { overlayEntry?.remove(); + overlayEntry?.dispose(); overlayEntry = null; } diff --git a/packages/flutter/lib/src/cupertino/context_menu.dart b/packages/flutter/lib/src/cupertino/context_menu.dart index da2aed2a09..113e923ab3 100644 --- a/packages/flutter/lib/src/cupertino/context_menu.dart +++ b/packages/flutter/lib/src/cupertino/context_menu.dart @@ -572,6 +572,7 @@ class _CupertinoContextMenuState extends State with Ticker }); } _lastOverlayEntry?.remove(); + _lastOverlayEntry?.dispose(); _lastOverlayEntry = null; case AnimationStatus.completed: @@ -585,6 +586,7 @@ class _CupertinoContextMenuState extends State with Ticker // one frame. SchedulerBinding.instance.addPostFrameCallback((Duration _) { _lastOverlayEntry?.remove(); + _lastOverlayEntry?.dispose(); _lastOverlayEntry = null; _openController.reset(); }); diff --git a/packages/flutter/lib/src/material/range_slider.dart b/packages/flutter/lib/src/material/range_slider.dart index 99677cfff7..c21c6b8ae6 100644 --- a/packages/flutter/lib/src/material/range_slider.dart +++ b/packages/flutter/lib/src/material/range_slider.dart @@ -484,10 +484,9 @@ class _RangeSliderState extends State with TickerProviderStateMixin enableController.dispose(); startPositionController.dispose(); endPositionController.dispose(); - if (overlayEntry != null) { - overlayEntry!.remove(); - overlayEntry = null; - } + overlayEntry?.remove(); + overlayEntry?.dispose(); + overlayEntry = null; super.dispose(); } @@ -842,8 +841,9 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix parent: _state.valueIndicatorController, curve: Curves.fastOutSlowIn, )..addStatusListener((AnimationStatus status) { - if (status == AnimationStatus.dismissed && _state.overlayEntry != null) { - _state.overlayEntry!.remove(); + if (status == AnimationStatus.dismissed) { + _state.overlayEntry?.remove(); + _state.overlayEntry?.dispose(); _state.overlayEntry = null; } }); diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index 34b806c87c..c28a03bec1 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -654,10 +654,9 @@ class _SliderState extends State with TickerProviderStateMixin { valueIndicatorController.dispose(); enableController.dispose(); positionController.dispose(); - if (overlayEntry != null) { - overlayEntry!.remove(); - overlayEntry = null; - } + overlayEntry?.remove(); + overlayEntry?.dispose(); + overlayEntry = null; _focusNode?.dispose(); super.dispose(); } @@ -1116,8 +1115,9 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin { parent: _state.valueIndicatorController, curve: Curves.fastOutSlowIn, )..addStatusListener((AnimationStatus status) { - if (status == AnimationStatus.dismissed && _state.overlayEntry != null) { - _state.overlayEntry!.remove(); + if (status == AnimationStatus.dismissed) { + _state.overlayEntry?.remove(); + _state.overlayEntry?.dispose(); _state.overlayEntry = null; } }); diff --git a/packages/flutter/lib/src/widgets/autocomplete.dart b/packages/flutter/lib/src/widgets/autocomplete.dart index c46d65d621..9f6e226b52 100644 --- a/packages/flutter/lib/src/widgets/autocomplete.dart +++ b/packages/flutter/lib/src/widgets/autocomplete.dart @@ -446,6 +446,7 @@ class _RawAutocompleteState extends State> } _floatingOptions?.remove(); + _floatingOptions?.dispose(); if (_shouldShowOptions) { final OverlayEntry newFloatingOptions = OverlayEntry( builder: (BuildContext context) { @@ -562,6 +563,7 @@ class _RawAutocompleteState extends State> _focusNode.dispose(); } _floatingOptions?.remove(); + _floatingOptions?.dispose(); _floatingOptions = null; super.dispose(); } diff --git a/packages/flutter/lib/src/widgets/heroes.dart b/packages/flutter/lib/src/widgets/heroes.dart index ca5e6d5f23..3970b5e63f 100644 --- a/packages/flutter/lib/src/widgets/heroes.dart +++ b/packages/flutter/lib/src/widgets/heroes.dart @@ -568,6 +568,7 @@ class _HeroFlight { assert(overlayEntry != null); overlayEntry!.remove(); + overlayEntry!.dispose(); overlayEntry = null; // We want to keep the hero underneath the current page hidden. If // [AnimationStatus.completed], toHero will be the one on top and we keep diff --git a/packages/flutter/lib/src/widgets/magnifier.dart b/packages/flutter/lib/src/widgets/magnifier.dart index 74ef957a3b..ea598e90a9 100644 --- a/packages/flutter/lib/src/widgets/magnifier.dart +++ b/packages/flutter/lib/src/widgets/magnifier.dart @@ -242,9 +242,8 @@ class MagnifierController { Widget? debugRequiredFor, OverlayEntry? below, }) async { - if (overlayEntry != null) { - overlayEntry!.remove(); - } + _overlayEntry?.remove(); + _overlayEntry?.dispose(); final OverlayState overlayState = Overlay.of( context, @@ -257,7 +256,7 @@ class MagnifierController { to: Navigator.maybeOf(context)?.context, ); - _overlayEntry = OverlayEntry( + _overlayEntry = OverlayEntry( builder: (BuildContext context) => capturedThemes.wrap(builder(context)), ); overlayState.insert(overlayEntry!, below: below); @@ -307,6 +306,7 @@ class MagnifierController { @visibleForTesting void removeFromOverlay() { _overlayEntry?.remove(); + _overlayEntry?.dispose(); _overlayEntry = null; } diff --git a/packages/flutter/lib/src/widgets/reorderable_list.dart b/packages/flutter/lib/src/widgets/reorderable_list.dart index cb9de37dec..bfb07016e7 100644 --- a/packages/flutter/lib/src/widgets/reorderable_list.dart +++ b/packages/flutter/lib/src/widgets/reorderable_list.dart @@ -832,6 +832,7 @@ class SliverReorderableListState extends State with Ticke _recognizer?.dispose(); _recognizer = null; _overlayEntry?.remove(); + _overlayEntry?.dispose(); _overlayEntry = null; _finalDropPosition = null; }