Skip to content

Flutter 3.44.0 - Breaking Change: ReorderableListView with tooltips in MenuAnchor throws assertion error #187162

Description

@kwhite-sdi

Steps to reproduce

After updating to Flutter 3.44.0 an ReorderableListView inside an MenuAnchor overlay with tooltipped items now throws an assertion error in the debug mode when reordering items.

  1. Start the App as a Web App
  2. Click on the Button to open the overlay
  3. Drag an item to a different position in the list

This does not happen when the items do not have a tooltip or when the ReorderableListView is not inside in an overlay.

Expected results

No assertion errors are thrown

Actual results

An assertion error is thrown in debug mode

Code sample

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(colorScheme: .fromSeed(seedColor: Colors.deepPurple)),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final controller = MenuController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: MenuAnchor(
          controller: controller,
          consumeOutsideTap: true,
          crossAxisUnconstrained: false,
          style: MenuStyle(
            fixedSize: WidgetStateProperty.fromMap(<WidgetStatesConstraint, Size?>{
              WidgetState.any: Size.fromWidth(300),
            }),
          ),
          menuChildren: [ConstrainedBox(constraints: BoxConstraints(maxHeight: 400), child: Test())],
          child: TextButton(onPressed: () => controller.open(), child: Text('Show')),
        ),
      ),
    );
  }
}

class Test extends StatefulWidget {
  const Test({super.key});

  @override
  State<Test> createState() => _TestState();
}

class _TestState extends State<Test> {
  final List<String> items = List.generate(10, (index) => 'Item $index');

  @override
  Widget build(BuildContext context) {
    return ReorderableListView.builder(
      buildDefaultDragHandles: false,
      itemCount: items.length,
      itemBuilder: (context, index) {
        final config = items[index];
        return ReorderableDragStartListener(
          key: ValueKey(items[index]),
          index: index,
          child: Tooltip(
            message: 'test $index',
            child: ListTile(title: Text(config)),
          ),
        );
      },
      onReorderItem: (int oldIndex, int newIndex) {
        setState(() {
          final item = items.removeAt(oldIndex);
          items.insert(newIndex, item);
        });
      },
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration

[Upload media here]

Logs

Logs
Launching lib/main.dart on Chrome in debug mode...
This app is linked to the debug service: ws://127.0.0.1:41533/n5xfRlB0Jys=/ws
Debug service listening on ws://127.0.0.1:41533/n5xfRlB0Jys=/ws
A Dart VM Service on Chrome is available at: http://127.0.0.1:41533/n5xfRlB0Jys=
The Flutter DevTools debugger and profiler on Chrome is available at: http://127.0.0.1:9101?uri=ws://127.0.0.1:41533/n5xfRlB0Jys=/ws
Connecting to VM Service at ws://127.0.0.1:41533/n5xfRlB0Jys=/ws
Connected to the VM Service.
Starting application from main method in: org-dartlang-app:/web_entrypoint.dart.
WARNING: Falling back to CPU-only rendering. Reason: webGLVersion is -1
Reloaded application in 375ms.
Reloaded application in 205ms.
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building _ReorderableItem-[_ReorderableItemGlobalKey
_ReorderableListViewChildGlobalKey#089e7](state: _ReorderableItemState#8b78d):
A _RenderLayoutBuilder was mutated in _RenderLayoutBuilder.performLayout.
The RenderObject was mutated when none of its ancestors is actively performing layout.
The RenderObject being mutated was:
  _RenderLayoutBuilder#a0a1d
The RenderObject that was mutating the said _RenderLayoutBuilder was:
  _RenderLayoutBuilder#3ecaa NEEDS-LAYOUT

The relevant error-causing widget was:
  ReorderableListView
  ReorderableListView:file:///home/kwhite/git/test/flutter_bug/minimal_example/lib/main.dart:68:32

When the exception was thrown, this was the stack:
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 274:3       throw_
package:flutter/src/rendering/object.dart 2364:9                                  <fn>
package:flutter/src/rendering/object.dart 2404:53                                 get [_debugCanPerformMutations]
package:flutter/src/rendering/object.dart 2661:12                                 markNeedsLayout
package:flutter/src/rendering/box.dart 2860:11                                    markNeedsLayout
package:flutter/src/rendering/object.dart 2487:7                                  attach
package:flutter/src/rendering/object.dart 4224:11                                 attach
package:flutter/src/rendering/object.dart 4225:13                                 attach
package:flutter/src/rendering/object.dart 2181:12                                 adoptChild
package:flutter/src/widgets/overlay.dart 1312:5                                   [_addDeferredChild]
package:flutter/src/widgets/overlay.dart 2217:5                                   [_activate]
package:flutter/src/widgets/overlay.dart 2426:8                                   activate
package:flutter/src/widgets/framework.dart 4736:12                                _activateRecursively
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/widgets/framework.dart 5871:7                                 visitChildren
package:flutter/src/widgets/framework.dart 4738:12                                _activateRecursively
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/widgets/framework.dart 5871:7                                 visitChildren
package:flutter/src/widgets/framework.dart 4738:12                                _activateRecursively
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/widgets/framework.dart 5871:7                                 visitChildren
package:flutter/src/widgets/framework.dart 4738:12                                _activateRecursively
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/widgets/framework.dart 7101:7                                 visitChildren
package:flutter/src/widgets/framework.dart 4738:12                                _activateRecursively
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/widgets/framework.dart 5871:7                                 visitChildren
package:flutter/src/widgets/framework.dart 4738:12                                _activateRecursively
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/widgets/framework.dart 5871:7                                 visitChildren
package:flutter/src/widgets/framework.dart 4738:12                                _activateRecursively
package:flutter/src/widgets/framework.dart 4729:5                                 [_activateWithParent]
...     Normal element mounting (55 frames)
package:flutter/src/widgets/framework.dart 4587:19                                inflateWidget
package:flutter/src/widgets/framework.dart 4053:20                                updateChild
package:flutter/src/widgets/sliver.dart 1086:37                                   updateChild
package:flutter/src/widgets/sliver.dart 979:35                                    processElement
dart-sdk/lib/core/iterable.dart 366:29                                            forEach
package:flutter/src/widgets/sliver.dart 1032:18                                   performRebuild
package:flutter/src/widgets/sliver.dart 955:7                                     update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5982:11                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 6007:5                                 update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 7122:14                                update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 4191:32                                updateChildren
package:flutter/src/widgets/framework.dart 7295:17                                update
package:flutter/src/widgets/viewport.dart 293:11                                  update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 7122:14                                update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 7122:14                                update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 7122:14                                update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 7122:14                                update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5982:11                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 6007:5                                 update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 7122:14                                update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 6149:5                                 update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 7122:14                                update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 6149:5                                 update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5982:11                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 6007:5                                 update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 5895:5                                 update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5982:11                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 6007:5                                 update
package:flutter/src/widgets/framework.dart 4037:14                                updateChild
package:flutter/src/widgets/framework.dart 5841:16                                performRebuild
package:flutter/src/widgets/framework.dart 5982:11                                performRebuild
package:flutter/src/widgets/framework.dart 5529:7                                 rebuild
package:flutter/src/widgets/framework.dart 2750:14                                [_tryRebuild]
package:flutter/src/widgets/framework.dart 2807:11                                [_flushDirtyElements]
package:flutter/src/widgets/framework.dart 3111:17                                buildScope
package:flutter/src/widgets/layout_builder.dart 270:5                             [_rebuildWithConstraints]
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/widgets/layout_builder.dart 333:28                            layoutCallback
package:flutter/src/widgets/overlay.dart 2864:11                                  layoutCallback
package:flutter/src/rendering/object.dart 4302:33                                 <fn>
package:flutter/src/rendering/object.dart 3026:9                                  <fn>
package:flutter/src/rendering/object.dart 1223:7                                  [_enableMutationsToDirtySubtrees]
package:flutter/src/rendering/object.dart 3025:7                                  invokeLayoutCallback
package:flutter/src/rendering/object.dart 4302:5                                  runLayoutCallback
package:flutter/src/widgets/overlay.dart 2870:5                                   performLayout
package:flutter/src/rendering/object.dart 2755:7                                  [_layoutWithoutResize]
package:flutter/src/rendering/object.dart 1174:17                                 flushLayout
package:flutter/src/rendering/object.dart 1187:14                                 flushLayout
package:flutter/src/rendering/binding.dart 643:5                                  drawFrame
package:flutter/src/widgets/binding.dart 1573:13                                  drawFrame
package:flutter/src/rendering/binding.dart 509:5                                  [_handlePersistentFrameCallback]
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
package:flutter/src/scheduler/binding.dart 1430:7                                 [_invokeFrameCallback]
package:flutter/src/scheduler/binding.dart 1345:9                                 handleDrawFrame
package:flutter/src/scheduler/binding.dart 1198:5                                 [_handleDrawFrame]
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 118:77  tear
lib/_engine/engine/platform_dispatcher.dart 1700:5                                invoke
lib/_engine/engine/platform_dispatcher.dart 268:5                                 invokeOnDrawFrame
lib/_engine/engine/frame_service.dart 209:32                                      [_renderFrame]
lib/_engine/engine/frame_service.dart 117:9                                       <fn>
dart-sdk/lib/async/zone.dart 962:54                                               runUnary
dart-sdk/lib/async/zone.dart 917:26                                               <fn>
dart-sdk/lib/_internal/js_dev_runtime/patch/js_allow_interop_patch.dart 218:27    _callDartFunctionFast1
dart-sdk/lib/_internal/js_dev_runtime/patch/js_allow_interop_patch.dart 78:15     ret

════════════════════════════════════════════════════════════════════════════════════════════════════
4
Another exception was thrown: Assertion failed: file:///usr/bin/flutter/packages/flutter/lib/src/widgets/overlay.dart:1310:12
Another exception was thrown: Assertion failed: file:///usr/bin/flutter/packages/flutter/lib/src/widgets/overlay.dart:1327:12
Another exception was thrown: Assertion failed: file:///usr/bin/flutter/packages/flutter/lib/src/rendering/object.dart:3675:12

Flutter Doctor output

Doctor output
[✓] Flutter (Channel stable, 3.44.0, on Ubuntu 24.04.4 LTS 6.6.87.2-microsoft-standard-WSL2, locale C.UTF-8) [234ms]
    • Flutter version 3.44.0 on channel stable at /usr/bin/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 559ffa3f75 (12 days ago), 2026-05-15 14:13:13 -0700
    • Engine revision 4c525dac5e
    • Dart version 3.12.0
    • DevTools version 2.57.0
    • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-swift-package-manager,
      omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration

[✗] Android toolchain - develop for Android devices [40ms]
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/to/linux-android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.


[✓] Chrome - develop for the web [9ms]
    • Chrome at google-chrome

[✗] Linux toolchain - develop for Linux desktop [637ms]
    • Ubuntu clang version 18.1.3 (1ubuntu1)
    • cmake version 3.28.3
    • ninja version 1.11.1
    • pkg-config version 1.8.1
    ✗ GTK 3.0 development libraries are required for Linux development.
      They are likely available from your distribution (e.g.: apt install libgtk-3-dev)
    • OpenGL core renderer: llvmpipe (LLVM 20.1.2, 256 bits)
    • OpenGL core version: 4.5 (Core Profile) Mesa 25.2.8-0ubuntu0.24.04.1
    • OpenGL core shading language version: 4.50
    • OpenGL ES renderer: llvmpipe (LLVM 20.1.2, 256 bits)
    • OpenGL ES version: OpenGL ES 3.2 Mesa 25.2.8-0ubuntu0.24.04.1
    • OpenGL ES shading language version: OpenGL ES GLSL ES 3.20
    • GL_EXT_framebuffer_blit: yes
    • GL_EXT_texture_format_BGRA8888: yes

[✓] Connected device (2 available) [157ms]
    • Linux (desktop) • linux  • linux-x64      • Ubuntu 24.04.4 LTS 6.6.87.2-microsoft-standard-WSL2
    • Chrome (web)    • chrome • web-javascript • Google Chrome 147.0.7727.116

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

! Doctor found issues in 2 categories.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High-priority issues at the top of the work listc: regressionIt was better in the past than it is nowframeworkflutter/packages/flutter repository. See also f: labels.has reproducible stepsThe issue has been confirmed reproducible and is ready to work onplatform-webWeb applications specificallyteam-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