Skip to content

[Google3 Bug][A11Y]: CheckedPopupMenuItem does not read as "selected" with screenreader #171463

@britnicanalegoogle

Description

@britnicanalegoogle

Help us understand the severity of this issue

  • causing severe production issues e.g. malfunctions or data loss
  • blocking next binary release
  • blocking a client feature launch within a quarter
  • nice-to-have but does not block a launch within the next quarter

Steps to reproduce

Use CheckedPopupMenuButton within a PopupMenu

Expected results

When using a screenreader, I expect a CheckedPopupMenuButton with checked=true to read as "selected" or "checked"

Actual results

CheckedPopupMenuButton items with checked=true are indistinguishable from those that aren't checked/selected.

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 const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(body: Center(child: PopupMenuExample())),
    );
  }
}

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

  @override
  State<StatefulWidget> createState() => PopupMenuExampleState();
}

class PopupMenuExampleState extends State<PopupMenuExample> {
  String selectedString = "OMG";
  final possibleSelections = ["OMG", "LOL", "ROFL", "WOW"];
  @override
  Widget build(BuildContext context) {
    return Container(
      child: PopupMenuButton<String>(
        key: ValueKey<String>('layerDropdown'),
        initialValue: selectedString,
        onSelected: (selection) {
          setState(() => selectedString = selection);
        },
        itemBuilder: (context) => [
          for (final stringVal in possibleSelections)
            CheckedPopupMenuItem(
              value: stringVal,
              checked: stringVal == selectedString,
              child: Text(stringVal),
            ),
        ],
      ),
    );
  }
}

Screenshots or Video

Screenshots / Video demonstration

[Upload media here]

Screen.Recording.2025-07-01.at.2.12.17.PM.mov

Logs

Logs
[Paste your logs here]

Flutter Doctor output

Doctor output
[Paste your output here]

Metadata

Metadata

Assignees

Labels

a: accessibilityAccessibility, e.g. VoiceOver or TalkBack. (aka a11y)customer: googleVarious Google teamsf: material designflutter/packages/flutter/material repository.found in release: 3.32Found to occur in 3.32found in release: 3.33Found to occur in 3.33frameworkflutter/packages/flutter repository. See also f: labels.has reproducible stepsThe issue has been confirmed reproducible and is ready to work onr: fixedIssue is closed as already fixed in a newer versionteam-webOwned by Web platform team

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions