system_tray 0.0.8
system_tray: ^0.0.8 copied to clipboard
system_tray that makes it easy to customize tray and work with your Flutter desktop app window **on Windows, macOS and Linux**.
system_tray #
A Flutter package that that enables support for system tray menu for desktop flutter apps. on Windows, macOS and Linux.
Features #
- Modify system tray title/icon/tooltip
- Handle system tray event leftMouseUp/rightMouseUp (only for macos、windows)
Install #
In the pubspec.yaml of your flutter project, add the following dependency:
dependencies:
...
system_tray: ^0.0.8
In your library add the following import:
import 'package:system_tray/system_tray.dart';
Prerequisite #
Linux #
sudo apt-get install appindicator3-0.1 libappindicator3-dev
Example App #
Windows #

macOS #

Linux #

Usage: #
Smallest example:
Future<void> initSystemTray() async {
String path =
Platform.isWindows ? 'assets/app_icon.ico' : 'assets/app_icon.png';
if (Platform.isMacOS) {
path = 'AppIcon';
}
final menu = [
MenuItem(label: 'Show', onClicked: _appWindow.show),
MenuItem(label: 'Hide', onClicked: _appWindow.hide),
MenuItem(label: 'Exit', onClicked: _appWindow.close),
];
await _systemTray.initSystemTray(
title: "system tray",
iconPath: path,
);
await _systemTray.setContextMenu(menu);
}
Icon flashing effect example:
Future<void> initSystemTray() async {
String path =
Platform.isWindows ? 'assets/app_icon.ico' : 'assets/app_icon.png';
if (Platform.isMacOS) {
path = 'AppIcon';
}
final menu = [
MenuItem(label: 'Show', onClicked: _appWindow.show),
MenuItem(label: 'Hide', onClicked: _appWindow.hide),
MenuItem(
label: 'Start flash tray icon',
onClicked: () {
debugPrint("Start flash tray icon");
_timer ??= Timer.periodic(
const Duration(milliseconds: 500),
(timer) {
_toogleTrayIcon = !_toogleTrayIcon;
_systemTray.setSystemTrayInfo(
iconPath: _toogleTrayIcon ? "" : path,
);
},
);
},
),
MenuItem(
label: 'Stop flash tray icon',
onClicked: () {
debugPrint("Stop flash tray icon");
_timer?.cancel();
_timer = null;
_systemTray.setSystemTrayInfo(
iconPath: path,
);
},
),
MenuSeparator(),
SubMenu(
label: "SubMenu",
children: [
MenuItem(
label: 'SubItem1',
enabled: false,
onClicked: () {
debugPrint("click SubItem1");
},
),
MenuItem(
label: 'SubItem2',
onClicked: () {
debugPrint("click SubItem2");
},
),
MenuItem(
label: 'SubItem3',
onClicked: () {
debugPrint("click SubItem3");
},
),
],
),
MenuSeparator(),
MenuItem(
label: 'Exit',
onClicked: _appWindow.close,
),
];
// We first init the systray menu and then add the menu entries
await _systemTray.initSystemTray(
title: "system tray",
iconPath: path,
toolTip: "How to use system tray with Flutter",
);
await _systemTray.setContextMenu(menu);
// handle system tray event
_systemTray.registerSystemTrayEventHandler((eventName) {
debugPrint("eventName: $eventName");
if (eventName == "leftMouseUp") {
_appWindow.show();
}
});
}
Addition #
Recommended library that supports window control:
Q&A #
- Q: If you encounter the following compilation error
A: add libc++.tbdUndefined symbols for architecture x86_64: "___gxx_personality_v0", referenced from: ...
1. open example/macos/Runner.xcodeproj 2. add 'libc++.tbd' to TARGET runner 'Link Binary With Libraries'