Skip to content

[web] Tristate Checkbox with value null is exposed as aria-checked="false"; SemanticCheckable never writes "mixed" #194547

Closed

Description

@jorgelrj

Reproduced on Flutter 3.47.4 stable (9584c67), Chrome on macOS. The code involved is unchanged on master 697012a (links below).

Steps to reproduce

  1. Run flutter build web on the code sample below, serve the build and open it in Chrome.
  2. Turn semantics on: run document.querySelector('flt-semantics-placeholder').click() in the console, or use a screen reader.
  3. Inspect the checkbox's flt-semantics element, or the checkbox in Chrome's accessibility tree.

Expected results

The checkbox has aria-checked="mixed", so a screen reader announces it as "mixed" or "partially checked".

Actual results

The checkbox has aria-checked="false", so a screen reader announces it as not checked.

The framework side is correct: the semantics node for the same checkbox has isChecked == CheckedState.mixed (see the widget test under Logs). The value is lost in the web engine.

Code sample

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

void main() => runApp(
  MaterialApp(
    home: Scaffold(
      body: Checkbox(tristate: true, value: null, onChanged: (_) {}, semanticLabel: 'Team'),
    ),
  ),
);

Screenshots or Video

Not applicable: the logs below are the evidence.

Logs

Logs

The checkbox's DOM element and its node in Chrome's accessibility tree:

DOM <flt-semantics id="flt-semantic-node-4" tabindex="0" aria-label="Team" flt-tappable="" role="checkbox" aria-checked="false" …>
AX  checkbox "Team" checked="false"

The widget test below, run on the same code sample, prints:

checkbox: isChecked=CheckedState.mixed
Widget test showing the framework sends CheckedState.mixed

package:repro/mixed_checkbox.dart is the code sample above.

import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:repro/mixed_checkbox.dart' as mixed;

void main() {
  testWidgets('tristate checkbox', (tester) async {
    final h = tester.ensureSemantics();
    mixed.main();
    await tester.pump();
    final d = find.semantics.byLabel('Team').evaluate().single.getSemanticsData();
    debugPrint('checkbox: isChecked=${d.flagsCollection.isChecked}');
    h.dispose();
  });
}

Cause

Suggested fix

In SemanticCheckable.update, write 'mixed' when semanticsObject.isMixed is true and _kind == _CheckableKind.checkbox. Alternatively, call addCheckedBehavior() from the SemanticCheckable constructor and drop the inline aria-checked write. For radio and switch, ARIA allows only true and false, so keep the current two-way value for those.

Related issues

Flutter Doctor output

Doctor output
[✓] Flutter (Channel stable, 3.47.4, on macOS 27.0.1 26A434 darwin-arm64, locale en-GB)
    • Flutter version 3.47.4 on channel stable at ~/Development/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 9584c6713b (5 weeks ago), 2026-09-10 15:25:10 -0700
    • Engine revision 06a2e2a110
    • Dart version 3.13.3
    • DevTools version 2.60.0
    • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration

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

[✓] Connected device (2 available)
    • macOS (desktop) • macos  • darwin-arm64   • macOS 27.0.1 26A434 darwin-arm64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 155.0.8059.82

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

(Android and Xcode checks timed out on this machine and are left out; they do not apply to these web/framework reports.)

Activity

  1. puneetkukreja98 commented on Oct 16, 2026

    @puneetkukreja98
    Contributor

    Thanks for reporting this. I was able to reproduce this on the latest stable channel on Windows.

    Findings:

    1. NVDA: "Team, check box, not checked"
    2. Narrator: "Team, check box, unchecked"

    Screen-shot
    Image

    flutter doctor -v:

    [√] Flutter (Channel stable, 3.47.7, on Microsoft Windows [Version 10.0.26200.9457], locale en-IN) [490ms]
        • Flutter version 3.47.7 on channel stable at C:\Developer\flutter
        • Upstream repository https://github.com/flutter/flutter.git
        • Framework revision abaf9c5237 (8 days ago), 2026-10-08 09:51:21 -0700
        • Engine revision deb287481e
        • Dart version 3.13.5
        • DevTools version 2.60.0
        • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android,
          enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager,
          omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration
    
    [√] Windows Version (Windows 11 or higher, 25H2, 2009) [2.8s]
    
    [√] Android toolchain - develop for Android devices (Android SDK version 37.0.0) [3.4s]
        • Android SDK at C:\Users\Puneet\AppData\Local\Android\sdk
        • Emulator version 36.6.11.0 (build_id 15507667) (CL:N/A)
        • Platform android-37.1, build-tools 37.0.0
        • Java binary at: C:\Program Files\Android\Android Studio1\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.10+-14961533-b1163.108)
        • All Android licenses accepted.
    
    [√] Chrome - develop for the web [157ms]
        • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe
    
    [√] Visual Studio - develop Windows apps (Visual Studio Community 2026 18.3.2) [156ms]
        • Visual Studio at C:\Program Files\Microsoft Visual Studio\18\Community
        • Visual Studio Community 2026 version 18.3.11520.95
        • Windows 10 SDK version 10.0.26100.0
    
    [√] Connected device (3 available) [352ms]
        • Windows (desktop) • windows • windows-x64    • Microsoft Windows [Version 10.0.26200.9457]
        • Chrome (web)      • chrome  • web-javascript • Google Chrome 155.0.8059.40
        • Edge (web)        • edge    • web-javascript • Microsoft Edge 155.0.4283.45
    
    [√] Network resources [897ms]
        • All expected network resources are available.
    
    • No issues found!
  2. added
    a: accessibilityAccessibility, e.g. VoiceOver or TalkBack. (aka a11y)
    team-accessibilityOwned by Framework Accessibility team (i.e. responsible for accessibility code in flutter/flutter)
    platform-webWeb applications specifically
    fyi-webFor the attention of Web platform team
    has reproducible stepsThe issue has been confirmed reproducible and is ready to work on
    and removed
    in triagePresently being triaged by the triage team
    on Oct 16, 2026
  3. flutter-zl commented on Oct 21, 2026

    @flutter-zl
    Contributor
  4. added
    triaged-webTriaged by Web platform team
    P2Important issues not at the top of the work list
    on Oct 21, 2026
  5. self-assigned this
    on Oct 21, 2026
  6. added
    P1High-priority issues at the top of the work list
    and removed
    P2Important issues not at the top of the work list
    on Oct 21, 2026
  7. added a commit that references this issue on Oct 29, 2026
    c92ef32
  8. github-actions commented on Nov 12, 2026

    @github-actions

    This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

  9. locked as resolved and limited conversation to collaborators on Nov 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

P1High-priority issues at the top of the work lista: accessibilityAccessibility, e.g. VoiceOver or TalkBack. (aka a11y)has reproducible stepsThe issue has been confirmed reproducible and is ready to work onplatform-webWeb applications specificallyteam-accessibilityOwned by Framework Accessibility team (i.e. responsible for accessibility code in flutter/flutter)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions