@@ -41,6 +41,14 @@ class _MenuExamplePageState extends State<MenuExamplePage> {
4141 String _currentLabel = 'Dynamic Label Item' ;
4242
4343 int _menuItemCount = 0 ;
44+
45+ // Store references to menu items for state management
46+ late final MenuItem _checkboxItem;
47+ late final MenuItem _radio1;
48+ late final MenuItem _radio2;
49+ late final MenuItem _radio3;
50+ late final MenuItem _submenuItem;
51+ late final Menu _submenu;
4452
4553 @override
4654 void initState () {
@@ -73,46 +81,63 @@ class _MenuExamplePageState extends State<MenuExamplePage> {
7381 _contextMenu.addSeparator ();
7482
7583 // 3. Checkbox menu item
76- final checkboxItem = MenuItem ('Checkbox Item' , MenuItemType .checkbox);
77- checkboxItem.on < MenuItemClickedEvent > ((event) {
84+ _checkboxItem = MenuItem ('Checkbox Item' , MenuItemType .checkbox);
85+ _checkboxItem.state = MenuItemState .unchecked;
86+ _checkboxItem.on < MenuItemClickedEvent > ((event) {
7887 setState (() {
7988 _checkboxState = ! _checkboxState;
89+ _checkboxItem.state = _checkboxState ? MenuItemState .checked : MenuItemState .unchecked;
8090 });
8191 _addToHistory ('Checkbox clicked - State: $_checkboxState (ID: ${event .menuItemId })' );
8292 });
83- _contextMenu.addItem (checkboxItem);
84- _menuItems.add (checkboxItem);
85-
86- // 4. Radio menu items
87- final radio1 = MenuItem ('Radio Option 1' , MenuItemType .radio);
88- radio1.on < MenuItemClickedEvent > ((event) {
93+ _contextMenu.addItem (_checkboxItem);
94+ _menuItems.add (_checkboxItem);
95+
96+ // 4. Radio menu items (grouped together)
97+ _radio1 = MenuItem ('Radio Option 1' , MenuItemType .radio);
98+ _radio1.radioGroup = 1 ; // Set radio group ID
99+ _radio1.state = MenuItemState .checked; // Default selection
100+ _radio1.on < MenuItemClickedEvent > ((event) {
89101 setState (() {
90102 _radioSelection = 'Option 1' ;
103+ _radio1.state = MenuItemState .checked;
104+ _radio2.state = MenuItemState .unchecked;
105+ _radio3.state = MenuItemState .unchecked;
91106 });
92107 _addToHistory ('Radio Option 1 selected (ID: ${event .menuItemId })' );
93108 });
94- _contextMenu.addItem (radio1 );
95- _menuItems.add (radio1 );
109+ _contextMenu.addItem (_radio1 );
110+ _menuItems.add (_radio1 );
96111
97- final radio2 = MenuItem ('Radio Option 2' , MenuItemType .radio);
98- radio2.on < MenuItemClickedEvent > ((event) {
112+ _radio2 = MenuItem ('Radio Option 2' , MenuItemType .radio);
113+ _radio2.radioGroup = 1 ; // Same radio group
114+ _radio2.state = MenuItemState .unchecked;
115+ _radio2.on < MenuItemClickedEvent > ((event) {
99116 setState (() {
100117 _radioSelection = 'Option 2' ;
118+ _radio1.state = MenuItemState .unchecked;
119+ _radio2.state = MenuItemState .checked;
120+ _radio3.state = MenuItemState .unchecked;
101121 });
102122 _addToHistory ('Radio Option 2 selected (ID: ${event .menuItemId })' );
103123 });
104- _contextMenu.addItem (radio2 );
105- _menuItems.add (radio2 );
124+ _contextMenu.addItem (_radio2 );
125+ _menuItems.add (_radio2 );
106126
107- final radio3 = MenuItem ('Radio Option 3' , MenuItemType .radio);
108- radio3.on < MenuItemClickedEvent > ((event) {
127+ _radio3 = MenuItem ('Radio Option 3' , MenuItemType .radio);
128+ _radio3.radioGroup = 1 ; // Same radio group
129+ _radio3.state = MenuItemState .unchecked;
130+ _radio3.on < MenuItemClickedEvent > ((event) {
109131 setState (() {
110132 _radioSelection = 'Option 3' ;
133+ _radio1.state = MenuItemState .unchecked;
134+ _radio2.state = MenuItemState .unchecked;
135+ _radio3.state = MenuItemState .checked;
111136 });
112137 _addToHistory ('Radio Option 3 selected (ID: ${event .menuItemId })' );
113138 });
114- _contextMenu.addItem (radio3 );
115- _menuItems.add (radio3 );
139+ _contextMenu.addItem (_radio3 );
140+ _menuItems.add (_radio3 );
116141
117142 // 5. Separator
118143 _contextMenu.addSeparator ();
@@ -138,13 +163,13 @@ class _MenuExamplePageState extends State<MenuExamplePage> {
138163 _contextMenu.addSeparator ();
139164
140165 // 9. Submenu
141- final submenu = Menu ();
142- final submenuItem = MenuItem ('Submenu' , MenuItemType .submenu);
166+ _submenu = Menu ();
167+ _submenuItem = MenuItem ('Submenu' , MenuItemType .submenu);
143168
144- submenuItem .on < MenuItemSubmenuOpenedEvent > ((event) {
169+ _submenuItem .on < MenuItemSubmenuOpenedEvent > ((event) {
145170 _addToHistory ('Submenu opened (ID: ${event .menuItemId })' );
146171 });
147- submenuItem .on < MenuItemSubmenuClosedEvent > ((event) {
172+ _submenuItem .on < MenuItemSubmenuClosedEvent > ((event) {
148173 _addToHistory ('Submenu closed (ID: ${event .menuItemId })' );
149174 });
150175
@@ -153,24 +178,27 @@ class _MenuExamplePageState extends State<MenuExamplePage> {
153178 subItem1.on < MenuItemClickedEvent > ((event) {
154179 _addToHistory ('Submenu Item 1 clicked (ID: ${event .menuItemId })' );
155180 });
156- submenu .addItem (subItem1);
181+ _submenu .addItem (subItem1);
157182
158183 final subItem2 = MenuItem ('Submenu Item 2' );
159184 subItem2.on < MenuItemClickedEvent > ((event) {
160185 _addToHistory ('Submenu Item 2 clicked (ID: ${event .menuItemId })' );
161186 });
162- submenu .addItem (subItem2);
187+ _submenu .addItem (subItem2);
163188
164- submenu .addSeparator ();
189+ _submenu .addSeparator ();
165190
166191 final subItem3 = MenuItem ('Submenu Item 3' );
167192 subItem3.on < MenuItemClickedEvent > ((event) {
168193 _addToHistory ('Submenu Item 3 clicked (ID: ${event .menuItemId })' );
169194 });
170- submenu.addItem (subItem3);
195+ _submenu.addItem (subItem3);
196+
197+ // Associate the submenu with the menu item
198+ _submenuItem.submenu = _submenu;
171199
172- _contextMenu.addItem (submenuItem );
173- _menuItems.add (submenuItem );
200+ _contextMenu.addItem (_submenuItem );
201+ _menuItems.add (_submenuItem );
174202
175203 // 10. Separator
176204 _contextMenu.addSeparator ();
@@ -265,6 +293,34 @@ class _MenuExamplePageState extends State<MenuExamplePage> {
265293 _addToHistory ('Menu item label changed to: $_currentLabel ' );
266294 }
267295
296+ void _setCheckboxMixed () {
297+ setState (() {
298+ _checkboxItem.state = MenuItemState .mixed;
299+ });
300+ _addToHistory ('Checkbox state set to Mixed (indeterminate)' );
301+ }
302+
303+ void _addSubmenuItem () {
304+ final newSubItem = MenuItem ('Dynamic Submenu Item ${_submenu .itemCount + 1 }' );
305+ newSubItem.on < MenuItemClickedEvent > ((event) {
306+ _addToHistory ('Dynamic submenu item clicked (ID: ${event .menuItemId })' );
307+ });
308+ _submenu.addItem (newSubItem);
309+ _addToHistory ('Added new item to submenu (Total: ${_submenu .itemCount })' );
310+ }
311+
312+ void _toggleSubmenu () {
313+ setState (() {
314+ if (_submenuItem.submenu != null ) {
315+ _submenuItem.submenu = null ;
316+ _addToHistory ('Submenu detached from menu item' );
317+ } else {
318+ _submenuItem.submenu = _submenu;
319+ _addToHistory ('Submenu attached to menu item' );
320+ }
321+ });
322+ }
323+
268324 void _addNewMenuItem () {
269325 final newItem = MenuItem ('New Item ${_menuItems .length + 1 }' );
270326 newItem.on < MenuItemClickedEvent > ((event) {
@@ -387,6 +443,24 @@ class _MenuExamplePageState extends State<MenuExamplePage> {
387443 label: const Text ('Change Dynamic Label' ),
388444 ),
389445 const SizedBox (height: 8 ),
446+ ElevatedButton .icon (
447+ onPressed: _setCheckboxMixed,
448+ icon: const Icon (Icons .indeterminate_check_box, size: 18 ),
449+ label: const Text ('Set Checkbox to Mixed State' ),
450+ ),
451+ const SizedBox (height: 8 ),
452+ ElevatedButton .icon (
453+ onPressed: _addSubmenuItem,
454+ icon: const Icon (Icons .add_box, size: 18 ),
455+ label: const Text ('Add Item to Submenu' ),
456+ ),
457+ const SizedBox (height: 8 ),
458+ ElevatedButton .icon (
459+ onPressed: _toggleSubmenu,
460+ icon: const Icon (Icons .swap_horiz, size: 18 ),
461+ label: const Text ('Toggle Submenu Attachment' ),
462+ ),
463+ const SizedBox (height: 8 ),
390464 ElevatedButton .icon (
391465 onPressed: _addNewMenuItem,
392466 icon: const Icon (Icons .add, size: 18 ),
0 commit comments