flutter 桌面應用之窗口自定義

在開發桌面軟件的時候我們經常需要配置軟件的窗口的大小以及位置
我們有兩個框架選擇:window_manager和bitsdojo_window


對比bitsdojo_window

特性bitsdojo_windowwindow_manager
自定義標題欄? 支持? 不支持
控制窗口行為(大小/位置)?(基本)?(更全面)
拖動窗口自定義區域??
是否保留原生邊框?(默認隱藏)?(保留系統默認)
最小化/最大化/關閉功能??
監聽窗口事件??
跨平臺支持Windows, macOS, LinuxWindows, macOS, Linux

組合使用建議

實際上,很多 Flutter 桌面項目會 同時使用這兩個庫

  • bitsdojo_window 自定義 UI 和拖動區域;

  • window_manager 控制窗口行為(比如窗口置頂、限制大小、獲取當前窗口狀態)。

bitsdojo_window支持的特性?

- 自定義窗口框架 - 移除 Windows/macOS/Linux 的標準標題欄和按鈕
- 啟動時隱藏窗口
- 顯示/隱藏窗口
- 使用 Flutter 小部件移動窗口
- 最小化/最大化/恢復/關閉窗口
- 設置窗口大小、最小尺寸和最大尺寸
- 設置窗口位置
- 設置窗口在屏幕上的對齊方式(居中/左上/右上/左下/右下)
- 設置窗口標題


hello word

在flutter啟動時設置窗口樣式

void main() async {runApp(const MyApp());doWhenWindowReady(() async {final win = appWindow;const initialSize = Size(300, 450);win.minSize = initialSize;win.size = initialSize;win.alignment = Alignment.center;win.title = "Custom window with Flutter";win.show();});
}

在MainFlutterWindow 中增加

在您的應用程序文件夾中,轉到macos\runner\MainFlutterWindow.swift并在以下行后添加此行import FlutterMacOS

import FlutterMacOS
import bitsdojo_window_macos // Add this line

然后將此行從:

class MainFlutterWindow: NSWindow {

對此:

class MainFlutterWindow: BitsdojoWindow {

更改后NSWindow,在BitsdojoWindow更改的行下方添加以下行:

override func bitsdojo_window_configure() -> UInt {return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
}

您的代碼現在應如下所示:

class MainFlutterWindow: BitsdojoWindow {override func bitsdojo_window_configure() -> UInt {return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP}override func awakeFromNib() {... //rest of your code

如果您不想使用自定義框架而更喜歡標準窗口標題欄和按鈕,則可以BDW_CUSTOM_FRAME從上面的代碼中刪除標志。

如果您不想在啟動時隱藏窗口,您可以BDW_HIDE_ON_STARTUP從上面的代碼中刪除標志。

運行效果

?

自定義topbar

mac平臺不能自定義 關閉/縮小/放大,windows可以

dojo_window windowbutton 用于這三者的基礎封裝,有三個實現

組件名說明
MinimizeWindowButton()最小化按鈕
MaximizeWindowButton()最大化按鈕
CloseWindowButton()關閉按鈕
WindowButtons(自定義)通常你會組合多個按鈕形成自己的窗口按鈕區域

WindowButton 參數詳解

這是核心組件,其他三個按鈕都基于它封裝:

WindowButton({required VoidCallback onPressed,required WindowButtonColors colors,required Widget icon,bool animate = true,double? iconSize,
})

參數說明:

參數名類型說明
onPressedVoidCallback點擊按鈕的事件處理函數(比如最小化窗口)
colorsWindowButtonColors定義按鈕在不同狀態下的顏色(常用)
iconWidget按鈕顯示的圖標,一般是 Icon(Icons.XXX)
animatebool是否啟用 hover 動畫(默認開啟)
iconSizedouble?圖標大小(可選,默認 10~16)

WindowButtonColors

用于自定義按鈕顏色

WindowButtonColors({required Color iconNormal,required Color mouseOver,required Color mouseDown,required Color iconMouseOver,required Color iconMouseDown,
})

示例說明:

屬性名說明
iconNormal默認狀態下圖標顏色
mouseOver鼠標懸停時的按鈕背景顏色
mouseDown鼠標點擊時的按鈕背景顏色
iconMouseOver懸停時的圖標顏色
iconMouseDown點擊時的圖標顏色

? 示例用法

CloseWindowButton(colors: WindowButtonColors(iconNormal: Colors.white,mouseOver: Colors.red,mouseDown: Colors.redAccent,iconMouseOver: Colors.white,iconMouseDown: Colors.white,),
)

或者使用 WindowButton 自定義:

WindowButton(onPressed: () => print("Clicked!"),icon: Icon(Icons.settings, size: 14, color: Colors.white),colors: WindowButtonColors(iconNormal: Colors.white,mouseOver: Colors.blueGrey,mouseDown: Colors.blue,iconMouseOver: Colors.white,iconMouseDown: Colors.white,),
)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75642.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cyber Weekly #51

賽博新聞 1、英偉達開源新模型,性能直逼DeepSeek-R1 本周,英偉達開源了基于Meta早期Llama-3.1-405B-Instruct模型開發的Llama-3.1-Nemotron-Ultra-253B-v1大語言模型,該模型擁有2530億參數,在多項基準測試中展現出與6710億參數的…

【JS】關于原型/原型鏈

本文會講解什么是原型,什么是原型鏈,以及查找原型的方法,最后會實現一個函數:判斷某對象是否有某屬性。 定義 原型:函數都有prototype屬性,稱作原型/原型對象 原型可以放一些方法和屬性,共享…

deskflow使用教程:一個可以讓兩臺電腦鼠標鍵盤截圖剪貼板共同使用的開源項目

首先去開源網站下載:Release v1.21.2 deskflow/deskflow 兩臺電腦都要下載這個文件 下載好后直接打開找到你想要的exe desflow.exe 然后你打開他,將兩臺電腦的TLS都關掉 下面步驟兩臺電腦都要完成: 電腦點開edit-》preferences 把這個取…

啥是Spring,有什么用,既然收費,如何免費創建SpringBoot項目,依賴下載不下來的解決方法,解決99%問題!

一、啥是Spring,為啥選擇它 我們平常說的Spring指的是Spring全家桶,我們為什么要選擇Spring,看看官方的話: 意思就是:用這個東西,又快又好又安全,反正就是好處全占了,所以我們選擇它…

正向代理 vs 反向代理:核心區別與應用場景詳解

目錄 代理服務器是什么? 正向代理(Forward Proxy)詳解 工作原理 典型應用場景 優缺點分析 反向代理(Reverse Proxy)詳解 工作原理 典型應用場景 優缺點分析 正向代理與反向代理的核心區別 對比表格 架構差異…

Matlab學習筆記五十:循環語句和條件語句的用法

1.說明 循環語句:for…end,while…end 條件語句:if…end,switch…case…end 其中if語句語法還可以是:for…else…end,for…elseif…else…end 2.簡單for程序實例 for x1:5 %循環遍歷1~5 yx5 end [1…

容器初始化Spring Boot項目原理,即web項目(war)包涉及相關類對比詳解

以下是關于 SpringBootServletInitializer、ServletContainerInitializer、SpringServletContainerInitializer、WebApplicationInitializer 和 ServletInitializer 的對比詳解及總結表格: 1. 核心對比詳解 (1) SpringBootServletInitializer 作用: S…

Linux 系統中打包與壓縮

以下是 Linux 系統中 打包與壓縮 的核心操作指南,涵蓋常用命令、格式對比及典型場景應用: 一、核心概念 打包(Archiving) 將多個文件或目錄合并為一個文件(如 .tar),不改變文件體積。常用工具&a…

計算機組成原理(哈工大,會持續更新)

文章目錄 一 計算機組成概述1.1計算機系統簡介 一 計算機組成概述 1.1計算機系統簡介 計算機軟硬件的概念 計算機系統包含兩個部分一個部分為硬件,另一個部分為軟件 硬件:硬件包括我們能直觀看到的東西,也就是我們計算機的實體&#xff0…

ngx_conf_handler

定義在 src\core\ngx_conf_file.c static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last) {char *rv;void *conf, **confp;ngx_uint_t i, found;ngx_str_t *name;ngx_command_t *cmd;name cf->args->elts;found 0;for (…

Ubuntu系統美化

Ubuntu系統美化 一、Grub設置 1. 安裝Grub Customizer【推薦】 Grub Customizer是一個用于自定義 GRUB 引導菜單的實用程序 sudo add-apt-repository ppa:danielrichter2007/grub-customizer && sudo apt update && sudo apt install -y grub-customizer2.…

零基礎HTML·筆記(持續更新…)

基礎認知 HTML標簽的結構 <strong>文字變粗</strong> &#xff1c;開始標簽&#xff1e;內容&#xff1c;結束標簽&#xff1e; 結構說明&#xff1a; 標簽由<、>、1、英文單詞或字母組成。并且把標簽中<>包括起來的英文單詞或字母稱為標簽名。常…

nmcli創建wpa-psk2 wifi熱點

1. 創建新的WiFi連接&#xff1a; sudo nmcli connection add type wifi ifname wlan0 con-name WiFi名稱 autoconnect yes ssid WiFi名稱 2. 配置接入點模式和IP共享&#xff1a; sudo nmcli connection modify WiFi名稱 802-11-wireless.mode ap 802-11-wireless.band …

【消息隊列kafka_中間件】一、快速入門分布式消息隊列

在當今大數據和分布式系統盛行的時代&#xff0c;消息隊列作為一種關鍵的中間件技術&#xff0c;發揮著舉足輕重的作用。其中&#xff0c;Apache Kafka 以其卓越的性能、高可擴展性和強大的功能&#xff0c;成為眾多企業構建分布式應用的首選消息隊列解決方案。本篇文章將帶你深…

在線地圖支持天地圖和騰訊地圖,儀表板和數據大屏支持發布功能,DataEase開源BI工具v2.10.7 LTS版本發布

2025年4月11日&#xff0c;人人可用的開源BI工具DataEase正式發布v2.10.7 LTS版本。 這一版本的功能變動包括&#xff1a;數據源方面&#xff0c;Oracle數據源支持獲取和查詢物化視圖&#xff1b;圖表方面&#xff0c;在線地圖支持天地圖、騰訊地圖&#xff1b;新增子彈圖&…

【Linux實踐系列】:匿名管道收尾+完善shell外殼程序

&#x1f525; 本文專欄&#xff1a;Linux Linux實踐項目 &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 人生總會有自己能力所不及的范圍&#xff0c;但是如果你在你能力所及的范圍盡了全部的努力&#xff0c;那你還有什么遺…

【C++初學】課后作業匯總復習(七) 指針-深淺copy

1、 HugeInt類:構造、、cout Description: 32位整數的計算機可以表示整數的范圍近似為&#xff0d;20億到&#xff0b;20億。在這個范圍內操作一般不會出現問題&#xff0c;但是有的應用程序可能需要使用超出上述范圍的整數。C可以滿足這個需求&#xff0c;創建功能強大的新的…

【C++】 —— 筆試刷題day_16

刷題_day16&#xff0c;繼續加油啊 一、字符串替換 題目解析 這道題是一道簡單的字符題目&#xff0c;題目給我們一個字符串A&#xff0c;和n表示A字符串的長度&#xff0c;再給出一個字符數組arg&#xff0c;m表示arg中是數據個數。 然我們在字符串A中找到%s然后替換成arg中的…

n8n 本地部署及實踐應用,實現零成本自動化運營 Telegram 頻道(保證好使)

n8n 本地部署及實踐應用&#xff0c;實現零成本自動化運營 Telegram 頻道&#xff08;保證好使&#xff09; 簡介 n8n 介紹 一、高度可定制性 二、豐富的連接器生態 三、自托管部署&#xff08;本地部署&#xff09; 四、社區驅動 n8n 的部署 一、前期準備 二、部署步…

flutter 桌面應用之系統托盤

系統托盤(Tray) 系統托盤就是狀態欄里面對應的圖標點擊菜單 主要有兩款框架 框架一句話評價tray_manager輕量、簡單、易用&#xff0c;適合常規托盤功能system_tray更底層、更強大、支持圖標/菜單/消息彈窗等更多功能&#xff0c;但復雜度更高 &#x1f9f1; 基礎能力對比 …