// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // THIS SAMPLE ONLY WORKS ON MACOS. import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; /// Flutter code sample for [PlatformMenuBar]. void main() => runApp(const ExampleApp()); enum MenuSelection { about, showMessage } class ExampleApp extends StatelessWidget { const ExampleApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp(home: Scaffold(body: PlatformMenuBarExample())); } } class PlatformMenuBarExample extends StatefulWidget { const PlatformMenuBarExample({super.key}); @override State createState() => _PlatformMenuBarExampleState(); } class _PlatformMenuBarExampleState extends State { String _message = 'Hello'; bool _showMessage = false; void _handleMenuSelection(MenuSelection value) { switch (value) { case MenuSelection.about: showAboutDialog( context: context, applicationName: 'MenuBar Sample', applicationVersion: '1.0.0', ); case MenuSelection.showMessage: setState(() { _showMessage = !_showMessage; }); } } @override Widget build(BuildContext context) { //////////////////////////////////// // THIS SAMPLE ONLY WORKS ON MACOS. //////////////////////////////////// // This builds a menu hierarchy that looks like this: // Flutter API Sample // ├ About // ├ ──────── (group divider) // ├ Hide/Show Message // ├ Messages // │ ├ I am not throwing away my shot. // │ └ There's a million things I haven't done, but just you wait. // └ Quit return PlatformMenuBar( menus: [ PlatformMenu( label: 'Flutter API Sample', menus: [ PlatformMenuItemGroup( members: [ PlatformMenuItem( label: 'About', onSelected: () { _handleMenuSelection(MenuSelection.about); }, ), ], ), PlatformMenuItemGroup( members: [ PlatformMenuItem( onSelected: () { _handleMenuSelection(MenuSelection.showMessage); }, shortcut: const CharacterActivator('m'), label: _showMessage ? 'Hide Message' : 'Show Message', ), PlatformMenu( label: 'Messages', menus: [ PlatformMenuItem( label: 'I am not throwing away my shot.', shortcut: const SingleActivator(LogicalKeyboardKey.digit1, meta: true), onSelected: () { setState(() { _message = 'I am not throwing away my shot.'; }); }, ), PlatformMenuItem( label: "There's a million things I haven't done, but just you wait.", shortcut: const SingleActivator(LogicalKeyboardKey.digit2, meta: true), onSelected: () { setState(() { _message = "There's a million things I haven't done, but just you wait."; }); }, ), ], ), ], ), if (PlatformProvidedMenuItem.hasMenu(PlatformProvidedMenuItemType.quit)) const PlatformProvidedMenuItem(type: PlatformProvidedMenuItemType.quit), ], ), ], child: Center( child: Text( _showMessage ? _message : 'This space intentionally left blank.\n' 'Show a message here using the menu.', ), ), ); } }