Skip to content

Memory Leak: Overlay.wrap doesn't dispose created OverlayEntry. #145687

@ksokolovskyi

Description

@ksokolovskyi

Steps to reproduce

  1. Search for if (isLeakTrackingEnabled()) { in the code and temporarily replace it with if (true)
  2. Run the following test:
   testWidgets('Overlay.wrap', (WidgetTester tester) async {
    await tester.pumpWidget(
      Directionality(
        textDirection: TextDirection.ltr,
        child: Overlay.wrap(
          child: const Center(
            child: Text('Hello World'),
          ),
        ),
      ),
    );
  });
Test output
✓ Overlay.wrap
Expected: leak free
  Actual: <Instance of 'Leaks'>
   Which: contains leaks:
          # The text is generated by leak_tracker.
          # For leak troubleshooting tips open:
          # https://github.com/dart-lang/leak_tracker/blob/main/doc/TROUBLESHOOT.md
          notDisposed:
            total: 2
            objects:
              OverlayEntry:
                test: Overlay.wrap
                identityHashCode: 870391968
                context:
                  start: >
                    #6_______dispatchFlutterEventToLeakTracker_(package:leak_tracker_flutter_testing/src/testing.dart:74:23)
                    #7______FlutterMemoryAllocations.dispatchObjectEvent_(package:flutter/src/foundation/memory_allocations.dart:249:23)
                    #8______FlutterMemoryAllocations.dispatchObjectCreated_(package:flutter/src/foundation/memory_allocations.dart:283:5)
                    #9______OverlayEntry._maybeDispatchObjectCreation_(package:flutter/src/widgets/overlay.dart:174:41)
                    #10_____new_OverlayEntry_(package:flutter/src/widgets/overlay.dart:89:7)
                    #11______WrappingOverlayState._entry_(package:flutter/src/widgets/overlay.dart:852:36)
                    #12______WrappingOverlayState._entry_(package:flutter/src/widgets/overlay.dart)
                    #13______WrappingOverlayState.build_(package:flutter/src/widgets/overlay.dart:870:38)
                    #14_____StatefulElement.build_(package:flutter/src/widgets/framework.dart:5599:27)
                    #15_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5487:15)
                    #16_____StatefulElement.performRebuild_(package:flutter/src/widgets/framework.dart:5650:11)
                    #17_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #18_____ComponentElement._firstBuild_(package:flutter/src/widgets/framework.dart:5469:5)
                    #19_____StatefulElement._firstBuild_(package:flutter/src/widgets/framework.dart:5641:11)
                    #20_____ComponentElement.mount_(package:flutter/src/widgets/framework.dart:5463:5)
                    #21_____Element.inflateWidget_(package:flutter/src/widgets/framework.dart:4340:16)
                    #22_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3849:18)
                    #23_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #24_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #25_____ComponentElement._firstBuild_(package:flutter/src/widgets/framework.dart:5469:5)
                    #26_____ComponentElement.mount_(package:flutter/src/widgets/framework.dart:5463:5)
                    #27_____Element.inflateWidget_(package:flutter/src/widgets/framework.dart:4340:16)
                    #28_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3843:20)
                    #29_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #30_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #31_____ProxyElement.update_(package:flutter/src/widgets/framework.dart:5816:5)
                    #32_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #33_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #34_____StatefulElement.performRebuild_(package:flutter/src/widgets/framework.dart:5650:11)
                    #35_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #36_____StatefulElement.update_(package:flutter/src/widgets/framework.dart:5673:5)
                    #37_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #38_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #39_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #40_____ProxyElement.update_(package:flutter/src/widgets/framework.dart:5816:5)
                    #41_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #42_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #43_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #44_____ProxyElement.update_(package:flutter/src/widgets/framework.dart:5816:5)
                    #45_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #46______RawViewElement._updateChild_(package:flutter/src/widgets/view.dart:291:16)
                    #47______RawViewElement.update_(package:flutter/src/widgets/view.dart:378:5)
                    #48_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #49_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #50_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #51_____StatelessElement.update_(package:flutter/src/widgets/framework.dart:5563:5)
                    #52_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #53_____RootElement._rebuild_(package:flutter/src/widgets/binding.dart:1466:16)
                    #54_____RootElement.update_(package:flutter/src/widgets/binding.dart:1444:5)
                    #55_____RootElement.performRebuild_(package:flutter/src/widgets/binding.dart:1458:7)
                    #56_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #57_____BuildOwner.buildScope_(package:flutter/src/widgets/framework.dart:2905:19)
                    #58_____AutomatedTestWidgetsFlutterBinding.drawFrame_(package:flutter_test/src/binding.dart:1418:19)
                    #59_____RendererBinding._handlePersistentFrameCallback_(package:flutter/src/rendering/binding.dart:443:5)
                    #60_____SchedulerBinding._invokeFrameCallback_(package:flutter/src/scheduler/binding.dart:1392:15)
                    #61_____SchedulerBinding.handleDrawFrame_(package:flutter/src/scheduler/binding.dart:1313:9)
                    #62_____AutomatedTestWidgetsFlutterBinding.pump.<anonymous_closure>_(package:flutter_test/src/binding.dart:1273:9)
                    #63______rootRun_(dart:async/zone.dart:1399:13)
                    #64______CustomZone.run_(dart:async/zone.dart:1301:19)
                    #65_____TestAsyncUtils.guard_(package:flutter_test/src/test_async_utils.dart:71:41)
                    #66_____AutomatedTestWidgetsFlutterBinding.pump_(package:flutter_test/src/binding.dart:1260:27)
                    #67_____WidgetTester.pumpWidget.<anonymous_closure>_(package:flutter_test/src/widget_tester.dart:602:22)
                    #68______rootRun_(dart:async/zone.dart:1399:13)
                    #69______CustomZone.run_(dart:async/zone.dart:1301:19)
                    #70_____TestAsyncUtils.guard_(package:flutter_test/src/test_async_utils.dart:71:41)
                    #71_____WidgetTester.pumpWidget_(package:flutter_test/src/widget_tester.dart:599:27)
                    #72_____main.<anonymous_closure>_(file:///Users/ksokolovskyi/development/flutter_master/packages/flutter/test/widgets/overlay_test.dart:1554:18)
                    #73_____testWidgets.<anonymous_closure>.<anonymous_closure>_(package:flutter_test/src/widget_tester.dart:183:29)
                    <asynchronous_suspension>
                    #74_____TestWidgetsFlutterBinding._runTestBody_(package:flutter_test/src/binding.dart:1017:5)
                    <asynchronous_suspension>
                    #75_____StackZoneSpecification._registerCallback.<anonymous_closure>_(package:stack_trace/src/stack_zone_specification.dart:114:42)
                    <asynchronous_suspension>
              ValueNotifier<_OverlayEntryWidgetState?>:
                test: Overlay.wrap
                identityHashCode: 1040880156
                context:
                  start: >
                    #6_______dispatchFlutterEventToLeakTracker_(package:leak_tracker_flutter_testing/src/testing.dart:74:23)
                    #7______FlutterMemoryAllocations.dispatchObjectEvent_(package:flutter/src/foundation/memory_allocations.dart:249:23)
                    #8______FlutterMemoryAllocations.dispatchObjectCreated_(package:flutter/src/foundation/memory_allocations.dart:283:5)
                    #9______ChangeNotifier.maybeDispatchObjectCreation_(package:flutter/src/foundation/change_notifier.dart:234:41)
                    #10_____new_ValueNotifier_(package:flutter/src/foundation/change_notifier.dart:538:22)
                    #11_____new_OverlayEntry_(package:flutter/src/widgets/overlay.dart:167:74)
                    #12______WrappingOverlayState._entry_(package:flutter/src/widgets/overlay.dart:852:36)
                    #13______WrappingOverlayState._entry_(package:flutter/src/widgets/overlay.dart)
                    #14______WrappingOverlayState.build_(package:flutter/src/widgets/overlay.dart:870:38)
                    #15_____StatefulElement.build_(package:flutter/src/widgets/framework.dart:5599:27)
                    #16_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5487:15)
                    #17_____StatefulElement.performRebuild_(package:flutter/src/widgets/framework.dart:5650:11)
                    #18_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #19_____ComponentElement._firstBuild_(package:flutter/src/widgets/framework.dart:5469:5)
                    #20_____StatefulElement._firstBuild_(package:flutter/src/widgets/framework.dart:5641:11)
                    #21_____ComponentElement.mount_(package:flutter/src/widgets/framework.dart:5463:5)
                    #22_____Element.inflateWidget_(package:flutter/src/widgets/framework.dart:4340:16)
                    #23_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3849:18)
                    #24_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #25_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #26_____ComponentElement._firstBuild_(package:flutter/src/widgets/framework.dart:5469:5)
                    #27_____ComponentElement.mount_(package:flutter/src/widgets/framework.dart:5463:5)
                    #28_____Element.inflateWidget_(package:flutter/src/widgets/framework.dart:4340:16)
                    #29_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3843:20)
                    #30_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #31_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #32_____ProxyElement.update_(package:flutter/src/widgets/framework.dart:5816:5)
                    #33_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #34_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #35_____StatefulElement.performRebuild_(package:flutter/src/widgets/framework.dart:5650:11)
                    #36_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #37_____StatefulElement.update_(package:flutter/src/widgets/framework.dart:5673:5)
                    #38_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #39_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #40_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #41_____ProxyElement.update_(package:flutter/src/widgets/framework.dart:5816:5)
                    #42_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #43_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #44_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #45_____ProxyElement.update_(package:flutter/src/widgets/framework.dart:5816:5)
                    #46_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #47______RawViewElement._updateChild_(package:flutter/src/widgets/view.dart:291:16)
                    #48______RawViewElement.update_(package:flutter/src/widgets/view.dart:378:5)
                    #49_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #50_____ComponentElement.performRebuild_(package:flutter/src/widgets/framework.dart:5512:16)
                    #51_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #52_____StatelessElement.update_(package:flutter/src/widgets/framework.dart:5563:5)
                    #53_____Element.updateChild_(package:flutter/src/widgets/framework.dart:3827:15)
                    #54_____RootElement._rebuild_(package:flutter/src/widgets/binding.dart:1466:16)
                    #55_____RootElement.update_(package:flutter/src/widgets/binding.dart:1444:5)
                    #56_____RootElement.performRebuild_(package:flutter/src/widgets/binding.dart:1458:7)
                    #57_____Element.rebuild_(package:flutter/src/widgets/framework.dart:5203:7)
                    #58_____BuildOwner.buildScope_(package:flutter/src/widgets/framework.dart:2905:19)
                    #59_____AutomatedTestWidgetsFlutterBinding.drawFrame_(package:flutter_test/src/binding.dart:1418:19)
                    #60_____RendererBinding._handlePersistentFrameCallback_(package:flutter/src/rendering/binding.dart:443:5)
                    #61_____SchedulerBinding._invokeFrameCallback_(package:flutter/src/scheduler/binding.dart:1392:15)
                    #62_____SchedulerBinding.handleDrawFrame_(package:flutter/src/scheduler/binding.dart:1313:9)
                    #63_____AutomatedTestWidgetsFlutterBinding.pump.<anonymous_closure>_(package:flutter_test/src/binding.dart:1273:9)
                    #64______rootRun_(dart:async/zone.dart:1399:13)
                    #65______CustomZone.run_(dart:async/zone.dart:1301:19)
                    #66_____TestAsyncUtils.guard_(package:flutter_test/src/test_async_utils.dart:71:41)
                    #67_____AutomatedTestWidgetsFlutterBinding.pump_(package:flutter_test/src/binding.dart:1260:27)
                    #68_____WidgetTester.pumpWidget.<anonymous_closure>_(package:flutter_test/src/widget_tester.dart:602:22)
                    #69______rootRun_(dart:async/zone.dart:1399:13)
                    #70______CustomZone.run_(dart:async/zone.dart:1301:19)
                    #71_____TestAsyncUtils.guard_(package:flutter_test/src/test_async_utils.dart:71:41)
                    #72_____WidgetTester.pumpWidget_(package:flutter_test/src/widget_tester.dart:599:27)
                    #73_____main.<anonymous_closure>_(file:///Users/ksokolovskyi/development/flutter_master/packages/flutter/test/widgets/overlay_test.dart:1554:18)
                    #74_____testWidgets.<anonymous_closure>.<anonymous_closure>_(package:flutter_test/src/widget_tester.dart:183:29)
                    <asynchronous_suspension>
                    #75_____TestWidgetsFlutterBinding._runTestBody_(package:flutter_test/src/binding.dart:1017:5)
                    <asynchronous_suspension>
                    #76_____StackZoneSpecification._registerCallback.<anonymous_closure>_(package:stack_trace/src/stack_zone_specification.dart:114:42)
                    <asynchronous_suspension>
package:matcher                                              expect
package:leak_tracker_testing/src/leak_testing.dart 69:24     LeakTesting.collectedLeaksReporter.<fn>
package:leak_tracker_flutter_testing/src/testing.dart 70:37  maybeTearDownLeakTrackingForAll
===== asynchronous gap ===========================
dart:async                                                   _CustomZone.registerBinaryCallback
package:flutter_test/src/test_compat.dart 283:3              _tearDownForTestFile
✖ (tearDownAll)

Flutter Doctor output

Doctor output
[!] Flutter (Channel [user-branch], 3.18.0-18.0.pre.1479, on macOS 14.1 23B2073 darwin-arm64, locale en-US)
    ! Flutter version 3.18.0-18.0.pre.1479 on channel [user-branch] at /Users/ksokolovskyi/development/flutter_master
      Currently on an unknown channel. Run `flutter channel` to switch to an official channel.
      If that doesn't fix the issue, reinstall Flutter by following instructions at https://flutter.dev/docs/get-started/install.
    ! Upstream repository unknown source is not the same as FLUTTER_GIT_URL
    • FLUTTER_GIT_URL = [email protected]:ksokolovskyi/flutter.git
    • Framework revision 90e15dbf42 (60 minutes ago), 2024-03-25 14:50:27 +0100
    • Engine revision 857584c458
    • Dart version 3.4.0 (build 3.4.0-268.0.dev)
    • DevTools version 2.34.0-dev.12
    • If those were intentional, you can disregard the above warnings; however it is recommended to use "git" directly to perform update checks and upgrades.

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
    • Android SDK at /Users/ksokolovskyi/Library/Android/sdk
    • Platform android-34, build-tools 34.0.0
    • ANDROID_HOME = /Users/ksokolovskyi/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 15.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 15C65
    • CocoaPods version 1.14.3

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2022.3)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b829.9-10027231)

[✓] VS Code (version 1.87.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.84.0

[✓] Connected device (4 available)
    • macOS (desktop)                 • macos                     • darwin-arm64   • macOS 14.1 23B2073 darwin-arm64
    • Chrome (web)                    • chrome                    • web-javascript • Google Chrome 120.0.6099.199

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 1 category.

Metadata

Metadata

Assignees

No one assigned

    Labels

    a: leak trackingIssues and PRs related to memory leaks detected by leak_trackera: tests"flutter test", flutter_test, or one of our testsframeworkflutter/packages/flutter repository. See also f: labels.team-frameworkOwned by Framework team

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions