@@ -1604,6 +1604,59 @@ void main() {
1604
1604
semantics.dispose ();
1605
1605
});
1606
1606
1607
+ testWidgets ('CheckedPopupMenuItem has correct semantics' , (WidgetTester tester) async {
1608
+ final SemanticsTester semantics = SemanticsTester (tester);
1609
+ await tester.pumpWidget (
1610
+ MaterialApp (
1611
+ home: Material (
1612
+ child: PopupMenuButton <int >(
1613
+ itemBuilder: (BuildContext context) {
1614
+ return < PopupMenuEntry <int >> [
1615
+ const CheckedPopupMenuItem <int >(
1616
+ value: 1 ,
1617
+ checked: true ,
1618
+ child: Text ('Checked Item' ),
1619
+ ),
1620
+ const CheckedPopupMenuItem <int >(value: 2 , child: Text ('Unchecked Item' )),
1621
+ ];
1622
+ },
1623
+ child: const SizedBox (height: 100.0 , width: 100.0 , child: Text ('XXX' )),
1624
+ ),
1625
+ ),
1626
+ ),
1627
+ );
1628
+ await tester.tap (find.text ('XXX' ));
1629
+ await tester.pumpAndSettle ();
1630
+
1631
+ // Verify that CheckedPopupMenuItem uses SemanticsRole.menuItemCheckbox
1632
+ final Iterable <SemanticsNode > allNodes = semantics.nodesWith ();
1633
+ final List <SemanticsNode > menuItemNodes = allNodes
1634
+ .where (
1635
+ (SemanticsNode node) => node.getSemanticsData ().role == SemanticsRole .menuItemCheckbox,
1636
+ )
1637
+ .toList ();
1638
+ expect (menuItemNodes, hasLength (2 ));
1639
+
1640
+ // Verify that the checked item has the correct properties
1641
+ final SemanticsNode checkedNode = menuItemNodes.firstWhere (
1642
+ (SemanticsNode node) => node.getSemanticsData ().hasFlag (SemanticsFlag .isChecked),
1643
+ );
1644
+ expect (checkedNode.getSemanticsData ().role, SemanticsRole .menuItemCheckbox);
1645
+ expect (checkedNode.getSemanticsData ().hasFlag (SemanticsFlag .isButton), isTrue);
1646
+ expect (checkedNode.getSemanticsData ().hasFlag (SemanticsFlag .hasCheckedState), isTrue);
1647
+
1648
+ // Verify that the unchecked item has the correct properties
1649
+ final SemanticsNode uncheckedNode = menuItemNodes.firstWhere (
1650
+ (SemanticsNode node) => ! node.getSemanticsData ().hasFlag (SemanticsFlag .isChecked),
1651
+ );
1652
+ expect (uncheckedNode.getSemanticsData ().role, SemanticsRole .menuItemCheckbox);
1653
+ expect (uncheckedNode.getSemanticsData ().hasFlag (SemanticsFlag .isButton), isTrue);
1654
+ expect (uncheckedNode.getSemanticsData ().hasFlag (SemanticsFlag .hasCheckedState), isTrue);
1655
+ expect (uncheckedNode.getSemanticsData ().hasFlag (SemanticsFlag .isChecked), isFalse);
1656
+
1657
+ semantics.dispose ();
1658
+ });
1659
+
1607
1660
testWidgets ('PopupMenuButton PopupMenuDivider' , (WidgetTester tester) async {
1608
1661
// Regression test for https://github.com/flutter/flutter/issues/27072
1609
1662
0 commit comments