leanflutter / tray_manager

This plugin allows Flutter desktop apps to defines system tray.
https://pub.dev/packages/tray_manager
MIT License
230 stars 36 forks source link

popUpContextMenu does not work #18

Closed sufu777 closed 2 years ago

sufu777 commented 2 years ago

TrayManager.instance.popUpContextMenu() does not work on windows 11? env: win11 Flutter 3.0.0 • channel stable • https://github.com/flutter/flutter.git Framework • revision ee4e09cce0 (8 days ago) • 2022-05-09 16:45:18 -0700 Engine • revision d1b9a6938a Tools • Dart 2.17.0 • DevTools 2.12.2

my code:

class _MyAppState extends State<MyApp> with TrayListener{

  @override
  void initState() {
    super.initState();
    initSystemTray();
    TrayManager.instance.addListener(this);
  }

  @override
  void dispose() {
    super.dispose();
    _timer?.cancel();
    TrayManager.instance.removeListener(this);
  }

  // 初始化菜单
  Future<void> initSystemTray() async {
    // 设置图标
    TrayManager.instance.setIcon(Platform.isWindows?'assets/tray_icon.ico':'assets/app_ico.png');
    List<MenuItem> menus = [
      MenuItem(key: "show_window",label: "打开窗口"),
      MenuItem.separator(),
      MenuItem(key: "exit",label: "退出")
    ];
    TrayManager.instance.setContextMenu(Menu(items: menus));
  }

  @override
  void onTrayIconMouseDown() {
    // windowManager.show();
    TrayManager.instance.popUpContextMenu();
  }

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Text("啦啦啦"),
      ),
    );
  }

  @override
  void onTrayIconRightMouseDown() {
    print("right mouse clicked");
    TrayManager.instance.popUpContextMenu();
  }

  @override
  void onTrayMenuItemClick(MenuItem menuItem) {
    if(menuItem.key == 'exit'){
      exit(0);
    }
  }
}

when right mouse down, it seems like main window was focused, but context mune does not pop up.just like this: o

as the gif show, onTrayIconRightMouseDown was called and successed to print log, but TrayManager.instance.popUpContextMenu(); does not work.

lijy91 commented 2 years ago

Please add await before setIcon to ensure that setIcon is executed before calling setContextMenu.


  Future<void> initSystemTray() async {
    // 设置图标
    await trayManager.setIcon(Platform.isWindows?'assets/tray_icon.ico':'assets/app_ico.png');
    List<MenuItem> menus = [
      MenuItem(key: "show_window",label: "打开窗口"),
      MenuItem.separator(),
      MenuItem(key: "exit",label: "退出")
    ];
    await trayManager.setContextMenu(Menu(items: menus));
  }