国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flutter桌面應(yīng)用程序定義系統(tǒng)托盤Tray

這篇具有很好參考價(jià)值的文章主要介紹了Flutter桌面應(yīng)用程序定義系統(tǒng)托盤Tray。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概念

系統(tǒng)托盤:系統(tǒng)托盤是一種用戶界面元素,通常出現(xiàn)在操作系統(tǒng)的任務(wù)欄或桌面頂部。它是一個(gè)水平的狹長(zhǎng)區(qū)域,用于顯示各種圖標(biāo)和通知,以提供快速訪問和操作特定應(yīng)用程序或系統(tǒng)功能。系統(tǒng)托盤通常包含操作系統(tǒng)或第三方應(yīng)用程序的圖標(biāo),這些圖標(biāo)可以顯示有關(guān)應(yīng)用程序狀態(tài)、提醒和通知等信息。用戶可以通過單擊這些圖標(biāo)來打開應(yīng)用程序的主窗口、執(zhí)行特定功能或查看詳細(xì)信息。系統(tǒng)托盤的設(shè)計(jì)旨在提供一種方便的方式來管理和訪問常用的應(yīng)用程序和系統(tǒng)功能,以提高用戶的工作效率。
效果展示
Flutter桌面應(yīng)用程序定義系統(tǒng)托盤Tray,Flutter桌面應(yīng)用開發(fā),flutter,flutter桌面應(yīng)用開發(fā),Window系統(tǒng)托盤,tray

作為現(xiàn)代操作系統(tǒng)中常見的一個(gè)組件,系統(tǒng)托盤能夠讓用戶方便地訪問常用的應(yīng)用程序或者系統(tǒng)功能。對(duì)于Flutter桌面應(yīng)用程序開發(fā)者來說,如何在應(yīng)用程序中定義系統(tǒng)托盤是一個(gè)值得探討的問題。本文將簡(jiǎn)介系統(tǒng)托盤的概念,并介紹兩種可用的Flutter桌面應(yīng)用程序系統(tǒng)托盤方案。

實(shí)現(xiàn)方案

1. tray_manager

依賴庫

tray_manager

支持平臺(tái)

Windows, macOS & Linux

實(shí)現(xiàn)步驟

  1. 在pubspec.yaml中添加依賴
dependencies:
  ...
  tray_manager: ^0.2.0
  1. 導(dǎo)入依賴
import 'package:flutter/material.dart' hide MenuItem;
import 'package:tray_manager/tray_manager.dart';
  1. 配置系統(tǒng)托盤特性
Future<void> _init() async {
  //設(shè)置系統(tǒng)托盤圖標(biāo),Windows圖標(biāo)必須文件后綴必須是.ico
  await trayManager.setIcon(
    Platform.isWindows
        ? 'assets/images/tray_icon_original.ico'
        : 'assets/images/img_1.png',
  );
  //設(shè)置系統(tǒng)托盤的標(biāo)題
  trayManager.setTitle("system tray");
  //設(shè)置系統(tǒng)托盤的標(biāo)題
  trayManager.setToolTip("How to use system tray with Flutter:鼠標(biāo)滑過提示");
  //設(shè)置系統(tǒng)托盤的菜單
  Menu menu = Menu(
    items: [
      //設(shè)置系統(tǒng)托盤的子菜單
      MenuItem.submenu(
          // key 
          key: 'window_settings',
          label: '窗口設(shè)置',
          //trayManager 不支持菜單項(xiàng)添加圖標(biāo),該配置無效
          icon: Platform.isWindows
              ? 'assets/images/app_icon.bmp'
              : 'assets/images/img_1.png',
          submenu: Menu(items: [
            MenuItem.checkbox(
              checked: true,
              label: "毛玻璃效果",
              onClick: (MenuItem menuItem) {
                menuItem.checked = !(menuItem.checked == true);
                if (kDebugMode) {
                  print("毛玻璃效果 onClick ${menuItem.checked}");
                }
                
              },
            ),
            MenuItem.checkbox(
              checked: true,
              label: "窗口置頂",
              onClick: (MenuItem menuItem) {
                menuItem.checked = !(menuItem.checked == true);
                if (kDebugMode) {
                  print("窗口置頂 onClick ${menuItem.checked}");
                }
              
              },
            ),
            MenuItem.checkbox(
              checked: true,
              label: "自啟動(dòng)",
              onClick: (MenuItem menuItem) {
                menuItem.checked = !(menuItem.checked == true);
                if (kDebugMode) {
                  print("自啟動(dòng) onClick ${menuItem.checked}");
                }
              },
            ),
            //可選類型的菜單欄
            MenuItem.checkbox(
              checked: true,
              label: "圖標(biāo)閃爍",
              onClick: (MenuItem menuItem) {
                menuItem.checked = !(menuItem.checked == true);
                if (kDebugMode) {
                  print("圖標(biāo)閃爍 onClick ${menuItem.checked}");
                }
              },
            ),
          ])),
      //分割線
      MenuItem.separator(),
      MenuItem(
          key: 'open_app',
          label: 'Open App',
          onClick: (MenuItem menuItem) {

          }),
      MenuItem(
          key: 'exit_app',
          label: 'Exit App',
          onClick: (MenuItem menuItem) {

          }),
    ],
  );
  if (kDebugMode) {
    print("menu:${menu.toJson()}");
  }
  //為系統(tǒng)托盤配置菜單
  await trayManager.setContextMenu(menu);
}
  1. 監(jiān)聽TrayListener
import 'package:flutter/material.dart';
import 'package:tray_manager/tray_manager.dart';

class HomePage extends StatefulWidget {
  
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with TrayListener {
  
  void initState() {
    trayManager.addListener(this);
    super.initState();
    _init();
  }

  
  void dispose() {
    trayManager.removeListener(this);
    super.dispose();
  }

  void _init() {
    // ...
  }

  
  Widget build(BuildContext context) {
    // ...
  }
//未觸發(fā)該事件
 
void onTrayIconRightMouseUp() {
  // TODO: implement onTrayIconRightMouseUp
  super.onTrayIconRightMouseUp();
  if (kDebugMode) {
    print("onTrayIconMouseUp");
  }
}

//未觸發(fā)該事件

void onTrayIconMouseUp() {
  super.onTrayIconMouseUp();
  if (kDebugMode) {
    print("onTrayIconMouseUp");
  }
}

void onTrayIconMouseDown() {
  if (kDebugMode) {
    print("onTrayIconMouseDown");
  }
  //彈出托盤的菜單欄
  trayManager.popUpContextMenu();
}


void onTrayIconRightMouseDown() {
  if (kDebugMode) {
    print("onTrayIconRightMouseDown");
  }
  //彈出托盤的菜單欄
  trayManager.popUpContextMenu();
}
 //彈出托盤的菜單欄點(diǎn)擊事件

void onTrayMenuItemClick(MenuItem menuItem) {
  if (kDebugMode) {
    print("menuItem:${menuItem.key}-${menuItem.label}");
  }
}
}

2. system_tray

依賴庫

system_tray

支持平臺(tái)

Windows, macOS & Linux

實(shí)現(xiàn)步驟

  1. 在pubspec.yaml中添加依賴
dependencies:
  ...
  system_tray: ^2.0.3
  1. 導(dǎo)入依賴
import 'package:system_tray/system_tray.dart';
  1. 配置系統(tǒng)托盤特性
//創(chuàng)建SystemTray 對(duì)象
final SystemTray _systemTray = SystemTray();
Timer? _timer;

//配置系統(tǒng)托盤
Future<void> _initSystemTray() async {
  //設(shè)置系統(tǒng)托盤的圖標(biāo),必須是.ico后綴的圖片
  await _systemTray.initSystemTray(
    iconPath: Platform.isWindows
        ? 'assets/images/tray_icon_original.ico'
        : 'assets/images/img_1.png',
  );
  //設(shè)置系統(tǒng)托盤的標(biāo)題
  _systemTray.setTitle("system tray");
  //設(shè)置系統(tǒng)托盤的提示
  _systemTray.setToolTip("How to use system tray with Flutter");
  //注冊(cè)系統(tǒng)托盤事件
  _systemTray.registerSystemTrayEventHandler((eventName) {
    debugPrint("eventName: $eventName");
    //注冊(cè)系統(tǒng)托盤事件:點(diǎn)擊事件
    if (eventName == kSystemTrayEventClick) {
      //Windows系統(tǒng):顯示主窗口   其他系統(tǒng)彈出托盤菜單彈框
      Platform.isWindows
          ? windowManager.show()
          : _systemTray.popUpContextMenu();
      //注冊(cè)系統(tǒng)托盤事件:鼠鍵右鍵
    } else if (eventName == kSystemTrayEventRightClick) {
      //Windows系統(tǒng):彈出托盤菜單彈框  其他系統(tǒng): 顯示主窗口
      Platform.isWindows
          ? _systemTray.popUpContextMenu()
          : windowManager.show();
    }
  });
  //創(chuàng)建托盤的菜單
  final Menu _menuMain = Menu();
  await _menuMain.buildFrom([
    //創(chuàng)建子菜單
    SubMenu(
        label: "窗口設(shè)置",
        //創(chuàng)建為菜單子項(xiàng)添加圖標(biāo),格式必須是bmp
        image: Platform.isWindows
            ? 'assets/images/app_icon.bmp'
            : 'assets/images/img_1.png',
        children: [
          //創(chuàng)建可選框類型的菜單項(xiàng)
          MenuItemCheckbox(
              label: "毛玻璃效果",
              checked: true,
              name: 'acrylic_cb',
              onClicked: (MenuItemBase menuItem) async {
                //更新MenuItemCheckbox的狀態(tài)
                await menuItem.setCheck(!menuItem.checked);
                if (kDebugMode) {
                  print("毛玻璃效果 onClick ${menuItem.checked}");
                }
                if (menuItem.checked == true) {
                  showAcrylic(color);
                } else {
                  closeAcrylic();
                }
              }),
          MenuItemCheckbox(
              label: "窗口置頂",
              checked: true,
              onClicked: (MenuItemBase menuItem) async {
                await menuItem.setCheck(!menuItem.checked);
                if (kDebugMode) {
                  print("窗口置頂 onClick ${menuItem.checked}");
                }
                if (menuItem.checked == true) {
                  windowManager.setAlwaysOnTop(true);
                } else {
                  windowManager.setAlwaysOnTop(false);
                }
              }),
          MenuItemCheckbox(
              label: "自啟動(dòng)",
              checked: true,
              name: 'auto_start_cb',
              onClicked: (MenuItemBase menuItem) async {
                // menuItem.checked = !(menuItem.checked == true);
                await menuItem.setCheck(!menuItem.checked);
                if (kDebugMode) {
                  print("自啟動(dòng) onClick ${menuItem.checked}");
                }
              }),
          MenuItemCheckbox(
              label: "圖標(biāo)閃爍",
              checked: true,
              name: "flash_cb",
              onClicked: (MenuItemBase menuItem) async {
                MenuItemCheckbox? flashCb =
                    _menuMain.findItemByName<MenuItemCheckbox>("flash_cb");
                await flashCb?.setCheck(!menuItem.checked);
                if (kDebugMode) {
                  print("圖標(biāo)閃爍 onClick ${menuItem.checked}");
                }
                if (menuItem.checked) {
                  startFlashIcon();
                } else {
                  stopFlashIcon();
                }
              }),
        ]),
    //菜單分割線
    MenuSeparator(),
    //菜單項(xiàng)
    MenuItemLabel(
        label: 'Open App',
        image: Platform.isWindows
            ? 'assets/images/app_icon.bmp'
            : 'assets/images/img_1.png',
        onClicked: (MenuItemBase menuItem) {
          windowManager.show();
        }),
    MenuItemLabel(
        label: 'Exit App',
        image: Platform.isWindows
            ? 'assets/images/app_icon.bmp'
            : 'assets/images/img_1.png',
        onClicked: (MenuItemBase menuItem) {
          windowManager.close();
        }),
  ]);
  if (kDebugMode) {
    print("menu:${_menuMain.toString()}");
  }
  //為系統(tǒng)托盤設(shè)置菜單項(xiàng)
  await _systemTray.setContextMenu(_menuMain);
}
  1. 完整代碼
import 'package:flutter/material.dart';
import 'package:tray_manager/tray_manager.dart';

class HomePage extends StatefulWidget {
  
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage>  {
 Timer? _timer;
 final SystemTray _systemTray = SystemTray();
  
  void initState() {
    super.initState();
    _initSystemTray();
  }

  
  void dispose() {
    _timer.cancel();
    super.dispose();
  }

  void _initSystemTray() {
    // ...
  }

//開始圖標(biāo)閃爍
void startFlashIcon() {
  if (kDebugMode) {
    print("startFlashIcon");
  }
  var imageList = const [
    "assets/images/tray_icon_original.ico",
    "assets/images/tray_icon.ico"
  ];
  var index = 0;
  _timer =
      Timer.periodic(const Duration(milliseconds: 500), (Timer timer) async {
    if (kDebugMode) {
      print("path:${imageList[index]}");
    }
    await _systemTray.setImage(imageList[index]);
    index = (index == 0) ? 1 : 0;
  });
}

//停止圖標(biāo)閃爍
void stopFlashIcon() async {
  if (kDebugMode) {
    print("stopFlashIcon");
  }
  _timer?.cancel();
  _timer = null;
  await _systemTray.setImage("assets/images/tray_icon_original.ico");
}
  
  Widget build(BuildContext context) {
    // ...
  }
}

3. 兩種方案對(duì)比

   system_tray 支持菜單項(xiàng)添加圖標(biāo),tray_manager不支持菜單項(xiàng)添加圖標(biāo)

4. 注意事項(xiàng)

Windows平臺(tái)系統(tǒng)托盤圖標(biāo)需要是以.ico后綴的圖片,菜單項(xiàng)圖標(biāo)需要是.bmp后綴的圖片,否則圖片無法顯示;文章來源地址http://www.zghlxwxcb.cn/news/detail-759696.html

5. 話題拓展

  • BMP格式(Bitmap):BMP是一種無損的位圖圖像格式,最初由Microsoft開發(fā)。它可以存儲(chǔ)圖像的像素顏色和位置信息,并支持不同的色彩深度。BMP文件通常較大,因?yàn)樗鼈儾唤?jīng)過壓縮,保留了圖像的每個(gè)像素的完整信息。BMP格式適用于Windows系統(tǒng)和一些圖像編輯軟件。
  • ICO格式(Icon):ICO是一種用于存儲(chǔ)圖標(biāo)的文件格式。ICO文件通常用于表示計(jì)算機(jī)系統(tǒng)上的各種圖標(biāo),例如文件夾、應(yīng)用程序和網(wǎng)站等的圖標(biāo)。ICO文件可以包含多個(gè)圖標(biāo)大小和顏色深度的版本,以適應(yīng)不同的顯示需求。ICO文件可以在Windows系統(tǒng)中直接使用,也可以在網(wǎng)頁或應(yīng)用程序中使用。

到了這里,關(guān)于Flutter桌面應(yīng)用程序定義系統(tǒng)托盤Tray的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Flutter中的Web應(yīng)用程序開發(fā):構(gòu)建現(xiàn)代Web應(yīng)用程序

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 作為人工智能專家,程序員和軟件架構(gòu)師,CTO,我今天將為大家分享有關(guān) Flutter 中 Web 應(yīng)用程序開發(fā)的見解。在這篇文章中,我們將深入探討 Flutter Web 應(yīng)用程序的開發(fā)過程、技術(shù)原理以及最佳實(shí)踐。 引言 隨著移動(dòng)設(shè)備的普及,Web 應(yīng)用程序在全

    2024年02月12日
    瀏覽(33)
  • C#桌面應(yīng)用程序開發(fā)的學(xué)習(xí)路線

    C#桌面應(yīng)用程序開發(fā)的學(xué)習(xí)路線。以下是一個(gè)基本的學(xué)習(xí)路線,供你參考: 1. C#基礎(chǔ) 學(xué)習(xí)C#的基本語法和面向?qū)ο缶幊蹋∣OP)的概念 了解C#的數(shù)據(jù)類型、變量和常量 學(xué)習(xí)控制結(jié)構(gòu)(如條件語句、循環(huán)語句)和函數(shù) 2. .NET框架和Windows Forms 了解.NET框架的基本概念和架構(gòu) 學(xué)習(xí)使用

    2024年02月10日
    瀏覽(24)
  • vite + electron 構(gòu)建前端桌面應(yīng)用程序

    vite + electron 構(gòu)建前端桌面應(yīng)用程序

    npm yarn 選擇是否繼續(xù) 項(xiàng)目名稱 選擇框架 選擇項(xiàng)目語言 項(xiàng)目構(gòu)建成功,根據(jù)提示進(jìn)入項(xiàng)目目錄,安裝依賴 electron 官網(wǎng):https://www.electronjs.org/zh/docs/latest/ vite-plugin-electron :https://github.com/electron-vite/vite-plugin-electron 安裝依賴(electron 安裝比較慢,耐心等待即可) 編寫 Electron 入

    2024年02月06日
    瀏覽(20)
  • 跨端開發(fā)方案之桌面應(yīng)用小程序

    跨端開發(fā)方案之桌面應(yīng)用小程序

    小程序容器技術(shù)的未來是充滿希望的,它為我們開辟了一個(gè)全新的數(shù)字世界,連接了桌面操作系統(tǒng)和移動(dòng)生態(tài)系統(tǒng)之間的界限。正如技術(shù)不斷演進(jìn),我們可以期待著更多的創(chuàng)新和發(fā)展,為用戶帶來更加便捷和多樣化的應(yīng)用體驗(yàn)。這一技術(shù)的推廣和應(yīng)用將繼續(xù)推動(dòng)數(shù)字科技的發(fā)

    2024年02月07日
    瀏覽(28)
  • 如何使用Vue.js構(gòu)建桌面應(yīng)用程序

    Vue.js是一個(gè)流行的JavaScript框架,可以用于構(gòu)建Web應(yīng)用程序。但是,Vue.js也可以用于構(gòu)建桌面應(yīng)用程序。本文將介紹如何使用Vue.js構(gòu)建桌面應(yīng)用程序,包括以下步驟: 1. 選擇一個(gè)Vue.js框架:選擇一個(gè)適合你的Vue.js框架。我們推薦使用Electron,因?yàn)樗亲盍餍械淖烂鎽?yīng)用程序框架

    2024年02月15日
    瀏覽(21)
  • Qt實(shí)現(xiàn)一個(gè)簡(jiǎn)單的應(yīng)用程序——桌面助手

    Qt實(shí)現(xiàn)一個(gè)簡(jiǎn)單的應(yīng)用程序——桌面助手

    1、實(shí)現(xiàn)不同功能之間的界面切換 2、可查看日歷 3、可實(shí)現(xiàn)計(jì)時(shí)器功能 4、可實(shí)現(xiàn)計(jì)算器功能 5、ui界面及按鈕部件背景的設(shè)置 6、為軟件設(shè)置圖標(biāo) 7、程序打包成軟件 ? ? ? 1、創(chuàng)建工程 ? ? ? ? New Project - Application - Qt Widgets Application然后下一步,使用ui界面文件能省去很多步驟

    2024年02月08日
    瀏覽(66)
  • 樹莓派的自啟動(dòng)與桌面應(yīng)用程序

    樹莓派的自啟動(dòng)與桌面應(yīng)用程序

    目錄 1??打開終端自啟動(dòng) .bashrc 2??觸發(fā)時(shí)機(jī)較早的開機(jī)自啟動(dòng)rc.local 3??桌面應(yīng)用程序 4??觸發(fā)時(shí)機(jī)較晚的的開機(jī)自啟動(dòng) autostart .bashrc的程序也可以在開機(jī)時(shí)進(jìn)行自啟動(dòng),但是每一次打開終端時(shí)同樣會(huì)運(yùn)行一遍,所以只需要開機(jī)啟動(dòng)一次的東西,不建議放到這里 修改 /home/用

    2024年02月12日
    瀏覽(23)
  • windows桌面應(yīng)用程序UI自動(dòng)化工具

    WinApp(Windows APP)是運(yùn)行在Windows操作系統(tǒng)上的應(yīng)用程序,通常會(huì)提供一個(gè)可視的界面,用于和用戶交互。 例如運(yùn)行在Windows系統(tǒng)上的Microsoft Office、PyCharm、Visual Studio Code、Chrome,都屬于WinApp。常見的WinApp,其擴(kuò)展名基本都是*.exe,運(yùn)行后也都會(huì)有一個(gè)漂亮、易用的UI界面,下面

    2024年02月11日
    瀏覽(19)
  • 實(shí)現(xiàn)Web頁面與桌面應(yīng)用程序之間的交互
  • sql文件批處理程序-java桌面應(yīng)用

    sql文件批處理程序-java桌面應(yīng)用

    ? ? 支持sql文件夾批處理,選中文件夾或者sql文件 支持測(cè)試連接,可以校驗(yàn)數(shù)據(jù)庫配置 支持報(bào)錯(cuò)回顯,彈出報(bào)錯(cuò)文件名以及問題語句 支持在程序中修改錯(cuò)誤語句,用戶可以選擇保存修改內(nèi)容繼續(xù)執(zhí)行或不保存修改只執(zhí)行 支持動(dòng)態(tài)顯示執(zhí)行進(jìn)度 支持自動(dòng)識(shí)別文件編碼進(jìn)行解

    2024年02月06日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包