Skip to content

Windows ListView+Tooltip can trigger error: Failed to update ui::AXTree, error: 9 will not be in the tree and is not the new root #182444

Open

Description

@yangyuan

Steps to reproduce

  1. Create an empty flutter project in Windows.
  2. Replace main.dart with my repro code.
  3. run and mouse hovering between container marked as A and B.

Then you will see the errors in console.


It seems only impacting Windows.

Here is my own mechanism analysis, just for reference.

ListView's two-pane semantics: RenderViewport adds useTwoPaneSemantics tag, causing _RenderScrollSemantics.assembleSemanticsNode() to create a synthetic _innerNode. This extra indirection isolates tooltip children from direct semantics update propagation.

Tooltip's OverlayPortal traversal grafting: Each Tooltip's overlay child (_RenderDeferredLayoutBox) is physically a child of _RenderTheater but semantically "grafted" to the tooltip's child via traversalChildIdentifier/traversalParentIdentifier.

The Bug Sequence (hover A → B)

  1. _handleMouseEnter on B fires — starts B's show (immediate) and A's dismiss (animated, 75ms)
  2. B's _RenderDeferredLayoutBox is added to the theater → markNeedsSemanticsUpdate()
  3. During SemanticsOwner.sendSemanticsUpdate(), A's deferred box node is detached and filtered into _detachedNodes
  4. Critical bug: Because A's node is filtered out before the traversal parent notification code runs, Tooltip A's child (TC_A) is never told its grafted traversal child is gone
  5. TC_A is never added to updatedVisitedNodes, so it never calls _addToUpdate() — no update sent to the engine
  6. The Windows AXTree still thinks TC_A has A's overlay node as a child, but that node no longer exists
  7. AXTree::Unserialize() fails: "* will not be in the tree and is not the new root"

Expected results

No errors.

Actual results

Throwing errors, though feature seems still not impacted.

Code sample

Code sample

Create an empty project and put this in main.dart

// Repro: ListView + 2 Tooltips → AXTree error on hover (Windows)
//
// Steps:
//   1. flutter run -d windows
//   2. Hover mouse over box A, then move to box B
//   3. Watch console for:
//      [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)]
//      Failed to update ui::AXTree

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: 'AXTree Tooltip Repro',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home: const TooltipReproPage(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('AXTree Tooltip Repro')),
      body: ListView(
        children: [
          Row(
            children: [
              Tooltip(
                message: 'Tooltip A',
                child: Container(
                  width: 100,
                  height: 100,
                  alignment: Alignment.center,
                  decoration: BoxDecoration(
                    color: const Color(0xFFE3F2FD),
                    borderRadius: BorderRadius.circular(8),
                    border: Border.all(
                      width: 1,
                      color: const Color(0xFF90CAF9),
                    ),
                  ),
                  child: const Text('A'),
                ),
              ),
              const SizedBox(width: 16),
              Tooltip(
                message: 'Tooltip B',
                child: Container(
                  width: 100,
                  height: 100,
                  alignment: Alignment.center,
                  decoration: BoxDecoration(
                    color: const Color(0xFFF5F5F5),
                    borderRadius: BorderRadius.circular(8),
                    border: Border.all(
                      width: 1,
                      color: const Color(0xFFE0E0E0),
                    ),
                  ),
                  child: const Text('B'),
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration

N/A

Logs

Logs
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 9 will not be in the tree and is not the new root
6
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 13 will not be in the tree and is not the new root
5
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 17 will not be in the tree and is not the new root
6
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 19 will not be in the tree and is not the new root
7
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 23 will not be in the tree and is not the new root
8
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 27 will not be in the tree and is not the new root
7
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 31 will not be in the tree and is not the new root
21
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 35 will not be in the tree and is not the new root
3
[ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 47 will not be in the tree and is not the new root

CHAT
FLUTTER AXTREE UPDATE ERROR WITH MULTIPLE ATTACHMENTS

Flutter Doctor output

Doctor output
flutter doctor -v
[√] Flutter (Channel stable, 3.41.1, on Microsoft Windows [Version 10.0.26200.7781],
    locale en-US) [590ms]
    • Flutter version 3.41.1 on channel stable at C:\Repos\flutter\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 582a0e7c55 (3 days ago), 2026-02-12 17:12:32 -0800
    • Engine revision 3452d735bd
    • Dart version 3.11.0
    • DevTools version 2.54.1
    • 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,
      enable-uiscene-migration

[√] Windows Version (Windows 11 or higher, 25H2, 2009) [1,186ms]

[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0) [478ms]
    • Android SDK at C:\Users\yuanyang\AppData\Local\Android\sdk
    • Emulator version 35.2.10.0 (build_id 12414864) (CL:N/A)
    X cmdline-tools component is missing.
      Try installing or updating Android Studio.
      Alternatively, download the tools from
      https://developer.android.com/studio#command-line-tools-only and make sure to set
      the ANDROID_HOME environment variable.
      See https://developer.android.com/studio/command-line for      See https://developer.android.com/studio/command-line for more details.
    X Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/to/windows-android-setup for more details.

[√] Chrome - develop for the web [138ms]
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop Windows apps (Visual Studio Enterprise 2022 17.14.26)
    [137ms]
    • Visual Studio at C:\Program Files\Microsoft Visual Studio\2022\Enterprise
    • Visual Studio Enterprise 2022 version 17.14.36930.0      
    • Windows 10 SDK version 10.0.26100.0

[√] Connected device (3 available) [399ms]
    • Windows (desktop) • windows • windows-x64    • Microsoft Windows [Version
      10.0.26200.7781]
    • Chrome (web)      • chrome  • web-javascript • Google Chrome 144.0.7559.133
    • Edge (web)        • edge    • web-javascript • Microsoft Edge 145.0.3800.58

[√] Network resources [782ms]
    • All expected network resources are available.

! Doctor found issues in 1 category.

Activity

  1. puneetkukreja98 commented on Feb 19, 2026

    @puneetkukreja98
    Contributor

    @yangyuan Thanks for reporting the issue.
    I was able to reproduce this issue on Windows following the steps provided.

    Observation:

    The AXTree errors appear in the console only when Windows Narrator is enabled.

    Flutter doctor -v

    [√] Flutter (Channel stable, 3.41.1, on Microsoft Windows [Version 10.0.26200.6584], locale en-IN) [367ms]
        • Flutter version 3.41.1 on channel stable at C:\developer\flutter
        • Upstream repository https://github.com/flutter/flutter.git
        • Framework revision 582a0e7c55 (6 days ago), 2026-02-12 17:12:32 -0800
        • Engine revision 3452d735bd
        • Dart version 3.11.0
        • DevTools version 2.54.1
        • 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, enable-uiscene-migration
    
    [√] Windows Version (Windows 11 or higher, 25H2, 2009) [3.8s]
    
    [√] Android toolchain - develop for Android devices (Android SDK version 36.1.0) [3.7s]
        • Android SDK at C:\Users\Puneet\AppData\Local\Android\sdk
        • Emulator version 36.3.10.0 (build_id 14472402) (CL:N/A)
        • Platform android-36, build-tools 36.1.0
        • Java binary at: C:\Program Files\Android\Android Studio\jbr\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 21.0.8+-14196175-b1038.72)
        • All Android licenses accepted.
    
    [√] Chrome - develop for the web [105ms]
        • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe
    
    [√] Visual Studio - develop Windows apps (Visual Studio Community 2026 18.2.1) [103ms]
        • Visual Studio at C:\Program Files\Microsoft Visual Studio\18\Community
        • Visual Studio Community 2026 version 18.2.11415.280
        • Windows 10 SDK version 10.0.26100.0
    
    [√] Connected device (3 available) [295ms]
        • Windows (desktop) • windows • windows-x64    • Microsoft Windows [Version 10.0.26200.6584]
        • Chrome (web)      • chrome  • web-javascript • Google Chrome 144.0.7559.133
        • Edge (web)        • edge    • web-javascript • Microsoft Edge 140.0.3485.66
    
    [√] Network resources [1,248ms]
        • All expected network resources are available.

    LOGS

    [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 81 will not be in the tree and is not the new root
    7
    [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 85 will not be in the tree and is not the new root
    7
    [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 89 will not be in the tree and is not the new root
    5
    [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 93 will not be in the tree and is not the new root
  2. added
    p: material_uimaterial_ui package in flutter/packages
    platform-windowsBuilding on or for Windows specifically
    and removed
    in triagePresently being triaged by the triage team
    on Feb 19, 2026
  3. added
    a: accessibilityAccessibility, e.g. VoiceOver or TalkBack. (aka a11y)
    team-windowsOwned by the Windows platform team
    P2Important issues not at the top of the work list
    triaged-windowsTriaged by the Windows platform team
    and removed on Feb 23, 2026
  4. ReinisSprogis commented on Feb 26, 2026

    @ReinisSprogis

    I also have this problem 3.41.2, on Microsoft Windows [Version 10.0.19045.6466],
    It seems like the Tooltip in some cases are triggering this error and it's not going away after hot restart.
    Initially some tooltips don't throw this error, but if I wrap DropdownButton in Tooltip and hover over it, then these errors will start flooding console for all widgets wrapped in Tooltip. I could not stand it anymore and disabled semantics for app altogether.

    void main() {
      Widget app = const ProviderScope(child: App());
      if (Platform.isWindows) {
        app = ExcludeSemantics(child: app);
      }
      runApp(app);
    }
  5. 3 remaining items

  6. added a commit that references this issue on Aug 24, 2026
  7. SamHL commented on Sep 1, 2026

    @SamHL

    On Windows release builds this is not only log spam. The same corrupted tree state terminates the process.

    AccessibilityBridge::CreateRemoveReparentedNodesUpdate dereferences child->parent() guarded only by an assert, which is compiled out in release:

    // Flutter's root node should never be reparented.
    assert(child->parent());
    
    // Skip nodes whose parents are unchanged.
    if (child->parent()->id() == node_update.second.id) {

    Once ui::AXTree::Unserialize has failed, which is exactly the failure this issue reports, the tree retains a node whose parent() is null, and the next semantics update naming it as a child walks into it. It is dereferenced again a few lines down at int32_t parent_id = child->parent()->id();.

    This runs on the platform thread inside WM_SIZE, so the access violation escapes a window procedure. Windows cannot propagate an exception across the kernel callback boundary, so it terminates the process with STATUS_FATAL_USER_CALLBACK_EXCEPTION (0xC000041D). There is no Dart error, no Flutter error and no Windows Error Reporting entry. The process simply disappears, which is why this took a debugger to find.

    Symbolicated against the shipped engine PDB (3.47.1, windows-x64-release):

    RVA 0x3c16a:
      flutter::AccessibilityBridge::CreateRemoveReparentedNodesUpdate + 0xba
      .../shell/platform/common/accessibility_bridge.cc:229
    

    Isolated with a controlled A/B in an app whose sidebar is a SingleChildScrollView + Column of tooltipped icon buttons, the same shape this issue describes. Same machine, same steps, minutes apart:

    Build Failed to update ui::AXTree lines Window resize
    Tooltips present 22 process killed on the first resize
    Tooltips removed 0 survived every resize, including maximize

    It needs an active accessibility client. With no AT attached the bridge is never created and nothing happens, which is presumably why it looks intermittent.

    anhquande/anhpt#25 and yvanvds/AccountManager#357 both reference this issue with crashes rather than log spam, so this may already be affecting more than one project.

    Suggested guard, if it is wanted:

    -      // Flutter's root node should never be reparented.
    -      assert(child->parent());
    +      if (!child->parent()) {
    +        continue;
    +      }

    Skipping looks like the correct result rather than only a safe one: this loop removes a child from its previous parent, and an orphan has none. It mirrors the if (!child) { continue; } two lines above, and behaviour is unchanged whenever the invariant holds. #190344 removes one way of producing the malformed update, but any other route into the same tree state is still a silent process kill rather than a logged warning.

    Happy to open a PR for that. I would want a steer on the regression test, since driving Unserialize to fail from inside accessibility_bridge_unittests.cc is the part I am least sure of.

  8. martin-robert-fink commented on Sep 14, 2026

    @martin-robert-fink

    Minimal shape, macOS, 3.47.3: a MenuAnchor whose builder returns a Tooltip around the anchor button.

    MenuAnchor(
      menuChildren: [MenuItemButton(onPressed: () {}, child: const Text('Share'))],
      builder: (context, controller, _) => Tooltip(
        message: 'Collaborate',
        child: TextButton.icon(
          onPressed: () => controller.isOpen ? controller.close() : controller.open(),
          icon: const Icon(Icons.groups_outlined),
          label: const Text('Collaborate'),
        ),
      ),
    )

    Opening the menu alone is clean. Hovering so the tooltip appears serializes the tooltip's overlay node (traversalParent = -1, one child: the tooltip text) with no parent claiming it; the bridge rejects the update and every later one that references it. Measured with a recording SemanticsUpdateBuilder in a widget test (deterministic, no screen reader), so this is easy to turn into a regression test.

    Inserting a semantics boundary between the two anchors — Semantics(container: true, child: Tooltip(...)) inside the builder — makes it clean, which matches #190344's diagnosis that the two traversalParentIdentifiers are being merged into one node and one dropped by ??= in absorb. Until #190344 lands, that boundary is the workaround we ship.

  9. oscar-vigo commented on Nov 5, 2026

    @oscar-vigo

    Additional independent reproduction on Flutter 3.47.2 stable / Windows 11 26H2, using the minimal ListView + two Tooltip example from this issue.

    Environment

    • Flutter 3.47.2 stable, framework d3b14c8769, engine a804b26164, Dart 3.13.2.
    • Windows 11 26H2, build 26300.9818.
    • Windows desktop, debug mode.
    • Windows Narrator was disabled throughout all tests. No NVDA, JAWS, Narrator or similar screen-reader processes were detected.

    Steps to reproduce

    1. Created a clean Flutter Windows project, independent of our application.
    2. Used the minimal ListView and two Tooltip example provided in this issue.
    3. Ran flutter run -d windows and repeatedly moved the pointer between A and B.
    4. The application built successfully, but the console repeatedly reported:
    [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 13 will not be in the tree and is not the new root
    [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 17 will not be in the tree and is not the new root
    [ERROR:flutter/shell/platform/common/accessibility_bridge.cc(114)] Failed to update ui::AXTree, error: 21 will not be in the tree and is not the new root
    

    Further errors appeared with node IDs 25, 29, 33, 37, 41, 45, 49 and others.

    Separately, our larger Flutter Windows application, BioMusic, produces similar accessibility-tree errors in both debug and release builds. The isolated reproduction demonstrates that the issue does not require BioMusic's widgets or dependencies.

    Result: Confirmed reproducible on Flutter 3.47.2 stable without Windows Narrator being enabled. The application remained running during the observed test.

  10. TomiWebPro commented on Nov 6, 2026

    @TomiWebPro

    I am experiencing same issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Important issues not at the top of the work lista: accessibilityAccessibility, e.g. VoiceOver or TalkBack. (aka a11y)p: material_uimaterial_ui package in flutter/packagesplatform-windowsBuilding on or for Windows specificallyteam-windowsOwned by the Windows platform teamtriaged-windowsTriaged by the Windows platform team

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions