Skip to content

OverlayPortal crashes on Hot Reload when reparented inside a LayoutBuilder #177693

@angelosilvestre

Description

@angelosilvestre

Steps to reproduce

  1. Run the sample code.
  2. Wrap the KeyedSubtree with a SizedBox.
  3. Save and Hot Reload

Expected results

App should not crash

Actual results

App crashes with the following exception:

════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building _MyWidget(state: _MyWidgetState#892bb):
A _RenderDeferredLayoutBox was mutated in _RenderLayoutBuilder.performLayout.
The RenderObject was mutated when none of its ancestors is actively performing layout.
The RenderObject being mutated was: _RenderDeferredLayoutBox#18fac NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
    parentData: not positioned; offset=Offset(0.0, 0.0)
    constraints: BoxConstraints(w=1000.0, h=650.0)
    size: Size(1000.0, 650.0)
The RenderObject that was mutating the said _RenderDeferredLayoutBox was: _RenderLayoutBuilder#2e698 relayoutBoundary=up1 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
    parentData: offset=Offset(0.0, 0.0); id=_ScaffoldSlot.body (can use size)
    constraints: BoxConstraints(0.0<=w<=1000.0, 0.0<=h<=650.0)
    size: Size(9.7, 20.0)

The relevant error-causing widget was:
    _MyWidget _MyWidget:file:///Users/angelosilvestre/dev/super_editor/super_editor/example/lib/main.dart:9:20

When the exception was thrown, this was the stack:
#0      RenderObject._debugCanPerformMutations.<anonymous closure> (package:flutter/src/rendering/object.dart:2230:9)
#1      RenderObject._debugCanPerformMutations (package:flutter/src/rendering/object.dart:2296:6)
#2      RenderObject.markNeedsLayout (package:flutter/src/rendering/object.dart:2529:12)
#3      RenderBox.markNeedsLayout (package:flutter/src/rendering/box.dart:2860:11)
#4      _RenderDeferredLayoutBox.markNeedsLayout (package:flutter/src/widgets/overlay.dart:2492:11)
#5      RenderObject.attach (package:flutter/src/rendering/object.dart:2355:7)
#6      RenderObjectWithChildMixin.attach (package:flutter/src/rendering/object.dart:4091:11)
#7      RenderObject.adoptChild (package:flutter/src/rendering/object.dart:2047:13)
#8      _RenderTheater._addDeferredChild (package:flutter/src/widgets/overlay.dart:1260:5)
#9      _OverlayEntryLocation._activate (package:flutter/src/widgets/overlay.dart:2131:14)
#10     _OverlayPortalElement.activate (package:flutter/src/widgets/overlay.dart:2340:55)
#11     Element._activateRecursively (package:flutter/src/widgets/framework.dart:4739:13)
#12     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5874:14)
#13     Element._activateRecursively (package:flutter/src/widgets/framework.dart:4741:13)
#14     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5874:14)
#15     Element._activateRecursively (package:flutter/src/widgets/framework.dart:4741:13)
#16     Element._activateWithParent (package:flutter/src/widgets/framework.dart:4732:5)
...     Normal element mounting (4 frames)
#20     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4590:20)
#21     Element.updateChild (package:flutter/src/widgets/framework.dart:4053:20)
#22     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5844:16)
#23     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5985:11)
#24     Element.rebuild (package:flutter/src/widgets/framework.dart:5532:7)
#25     StatefulElement.update (package:flutter/src/widgets/framework.dart:6010:5)
#26     Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#27     _LayoutBuilderElement._rebuildWithConstraints.updateChildCallback (package:flutter/src/widgets/layout_builder.dart:248:18)
#28     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3101:19)
#29     _LayoutBuilderElement._rebuildWithConstraints (package:flutter/src/widgets/layout_builder.dart:271:12)
#30     RenderAbstractLayoutBuilderMixin.layoutCallback (package:flutter/src/widgets/layout_builder.dart:334:38)
#31     RenderObjectWithLayoutCallbackMixin.runLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:4169:33)
#32     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:2894:17)
#33     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:1219:15)
#34     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:2893:14)
#35     RenderObjectWithLayoutCallbackMixin.runLayoutCallback (package:flutter/src/rendering/object.dart:4169:5)
#36     _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:448:5)
#37     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#38     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:180:12)
#39     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1112:7)
#40     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:249:7)
#41     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:420:14)
#42     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#43     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#44     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#45     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#46     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1481:11)
#47     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#48     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#49     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#50     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#51     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#52     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#53     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#54     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#55     RenderStack._computeSize (package:flutter/src/rendering/stack.dart:645:43)
#56     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:680:12)
#57     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#58     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#59     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#60     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#61     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#62     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#63     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#64     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#65     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#66     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#67     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#68     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#69     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3848:13)
#70     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#71     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#72     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#73     _RenderTheaterMixin.layoutChild (package:flutter/src/widgets/overlay.dart:1084:13)
#74     _RenderTheater.performLayout (package:flutter/src/widgets/overlay.dart:1429:9)
#75     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#76     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#80     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#81     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#82     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#83     RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:574:11)
#84     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#85     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#86     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#87     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#88     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#89     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#90     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#91     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#92     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#93     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#94     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#95     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#96     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#97     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#98     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#99     RenderView.performLayout (package:flutter/src/rendering/view.dart:294:12)
#100    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2623:7)
#101    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1170:18)
#102    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1183:15)
#103    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:629:23)
#104    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1264:13)
#105    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5)
#106    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15)
#107    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9)
#108    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:1057:9)
#109    PlatformDispatcher.scheduleWarmUpFrame.<anonymous closure> (dart:ui/platform_dispatcher.dart:906:16)
#113    _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
(elided 3 frames from class _Timer and dart:async-patch)

════════════════════════════════════════════════════════════════════════════════
Reloaded 1 of 803 libraries in 257ms (compile: 10 ms, reload: 63 ms, reassemble: 109 ms).

Code sample

Code sample
import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: LayoutBuilder(
          builder: (context, constraints) {
            return _DeleteMe();
          },
        ),
      ),
    ),
  );
}

class _DeleteMe extends StatefulWidget {
  const _DeleteMe();

  @override
  State<_DeleteMe> createState() => _DeleteMeState();
}

class _DeleteMeState extends State<_DeleteMe> {
  final _myKey = GlobalKey();
  final _overlayController = OverlayPortalController();

  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((_) {
      _overlayController.show();
    });
  }

  @override
  Widget build(BuildContext context) {
    return KeyedSubtree(
      key: _myKey,
      child: OverlayPortal(
        controller: _overlayController,
        overlayChildBuilder: (context) => const SizedBox(),
        child: Text('A'),
      ),
    );
  }
}

Screenshots or Video

No response

Logs

Logs
Not applicable

Flutter Doctor output

Doctor output
$ flutter doctor -v
[✓] Flutter (Channel master, 3.38.0-1.0.pre-158, on macOS 26.0.1
    25A362 darwin-arm64, locale en-BR) [2.2s]
    • Flutter version 3.38.0-1.0.pre-158 on channel master at
      /Users/angelosilvestre/dev/flutter
    • Upstream repository [email protected]:flutter/flutter.git
    • Framework revision 4ddd558fab (8 days ago), 2025-10-20
      23:41:51 +0300
    • Engine revision 9dff19e510
    • Dart version 3.11.0 (build 3.11.0-36.0.dev)
    • DevTools version 2.51.0
    • Feature flags: enable-web, enable-linux-desktop,
      enable-macos-desktop, enable-windows-desktop, enable-android,
      enable-ios, cli-animations, enable-native-assets,
      omit-legacy-version-file, enable-lldb-debugging

[✓] Android toolchain - develop for Android devices (Android SDK
    version 36.0.0) [2.1s]
    • Android SDK at /Users/angelosilvestre/Library/Android/sdk
    • Emulator version 35.3.11.0 (build_id 12836668) (CL:N/A)
    • Platform android-36, build-tools 36.0.0
    • Java binary at: /Applications/Android
      Studio.app/Contents/jbr/Contents/Home/bin/java
      This is the JDK bundled with the latest Android Studio
      installation on this machine.
      To manually set the JDK path, use: `flutter config
      --jdk-dir="path/to/jdk"`.
    • 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 26.0.1) [1,507ms]
    • Xcode at /Applications/Xcode.app/Contents/Developer              • Build 17A400
    • CocoaPods version 1.16.2

[✓] Chrome - develop for the web [6ms]
    • Chrome at /Applications/Google
      Chrome.app/Contents/MacOS/Google Chrome                                                                                         [✓] Connected device (3 available) [6.3s]
    • iPhone 16 Pro (mobile) • 7DD3D0A8-E288-4B22-B511-10B818943D0E
      • ios            •
      com.apple.CoreSimulator.SimRuntime.iOS-18-2 (simulator)
    • macOS (desktop)        • macos
      • darwin-arm64   • macOS 26.0.1 25A362 darwin-arm64
    • Chrome (web)           • chrome
      • web-javascript • Google Chrome 141.0.7390.123

[✓] Network resources [1,418ms]
    • All expected network resources are available.

• No issues found!

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Important issues not at the top of the work lista: error messageError messages from the Flutter frameworkc: crashStack traces logged to the consolec: regressionIt was better in the past than it is nowfound in release: 3.35Found to occur in 3.35found in release: 3.38Found to occur in 3.38frameworkflutter/packages/flutter repository. See also f: labels.has reproducible stepsThe issue has been confirmed reproducible and is ready to work ont: hot reloadReloading code during "flutter run"team-frameworkOwned by Framework teamtriaged-frameworkTriaged by Framework team

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions