🚀 Ship Your App Faster: Try Fastforge - The simplest way to build, package and distribute your Flutter apps.
This plugin allows Flutter desktop apps to defines system tray.
Note: This plugin is planned to migrate to nativeapi to improve maintainability and performance, but the solution is still experimental at this stage.
English | 简体中文
Linux | macOS | Windows |
---|---|---|
✔️ | ✔️ | ✔️ |
macOS | Linux | Windows |
---|---|---|
![]() | ![]() | ![]() |
When using the app_links
package together with tray_manager
, the plugin may not work properly. This is because older versions of app_links
internally block event propagation, preventing menu click events from being triggered.
To resolve this issue:
- Make sure your
app_links
package version is greater than or equal to 6.3.3
dependencies: app_links: ^6.3.3
- Use protocol_handler package instead of
app_links
package.
In GNOME desktop environment, the AppIndicator extension may be required to display the icon.
Add this to your package's pubspec.yaml file:
dependencies: tray_manager: ^0.5.0
Or
dependencies: tray_manager: git: url: https://github.com/leanflutter/tray_manager.git ref: main path: packages/tray_manager
ayatana-appindicator3-0.1
orappindicator3-0.1
Run the following command
sudo apt-get install libayatana-appindicator3-dev
Or
sudo apt-get install appindicator3-0.1 libappindicator3-dev
import 'package:flutter/material.dart' hide MenuItem; import 'package:tray_manager/tray_manager.dart'; await trayManager.setIcon( Platform.isWindows ? 'images/tray_icon.ico' : 'images/tray_icon.png', ); Menu menu = Menu( items: [ MenuItem( key: 'show_window', label: 'Show Window', ), MenuItem.separator(), MenuItem( key: 'exit_app', label: 'Exit App', ), ], ); await trayManager.setContextMenu(menu);
Please see the example app of this plugin for a full example.
import 'package:flutter/material.dart'; import 'package:tray_manager/tray_manager.dart'; class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> with TrayListener { @override void initState() { trayManager.addListener(this); super.initState(); _init(); } @override void dispose() { trayManager.removeListener(this); super.dispose(); } void _init() { // ... } @override Widget build(BuildContext context) { // ... } @override void onTrayIconMouseDown() { // do something, for example pop up the menu trayManager.popUpContextMenu(); } @override void onTrayIconRightMouseDown() { // do something } @override void onTrayIconRightMouseUp() { // do something } @override void onTrayMenuItemClick(MenuItem menuItem) { if (menuItem.key == 'show_window') { // do something } else if (menuItem.key == 'exit_app') { // do something } } }
- Airclap - Send any file to any device. cross platform, ultra fast and easy to use.
- Biyi (比译) - A convenient translation and dictionary app.
Method | Description | Linux | macOS | Windows |
---|---|---|---|---|
destroy | Destroys the tray icon immediately. | ✔️ | ✔️ | ✔️ |
setIcon | Sets the image associated with this tray icon. | ✔️ | ✔️ | ✔️ |
setIconPosition | Sets the icon position of the tray icon. | ➖ | ✔️ | ➖ |
setToolTip | Sets the hover text for this tray icon. | ➖ | ✔️ | ✔️ |
setContextMenu | Sets the context menu for this icon. | ✔️ | ✔️ | ✔️ |
popUpContextMenu | Pops up the context menu of the tray icon. | ➖ | ✔️ | ✔️ |
getBounds | Returns Rect The bounds of this tray icon. | ➖ | ✔️ | ✔️ |