使用 Flutter 構建 Windows 應用
本頁討論使用 Flutter 構建 Windows 應用的獨特注意事項,包括外殼整合以及透過 Microsoft Store 在 Windows 上分發 Windows 應用。
整合 Windows
#Windows 程式設計介面結合了傳統的 Win32 API、COM 介面以及更現代的 Windows Runtime 庫。由於所有這些都提供了基於 C 的 ABI,您可以使用 Dart 的 Foreign Function Interface 庫(dart:ffi)呼叫作業系統提供的服務。FFI 旨在使 Dart 程式能夠高效地呼叫 C 庫。它為 Flutter 應用提供了使用 malloc 或 calloc 分配原生記憶體的能力,支援指標、結構體和回撥,以及 long 和 size_t 等 ABI 型別。
有關從 Flutter 呼叫 C 庫的更多資訊,請參閱 使用 dart:ffi 進行 C 互操作。
實際上,雖然透過這種方式從 Dart 呼叫基本的 Win32 API 相對簡單,但使用封裝庫來抽象 COM 程式設計模型的複雜性會更容易。 win32 包 提供了一個用於訪問數千個常用 Windows API 的庫,它使用 Microsoft 提供的元資料以保持一致性和正確性。該包還包括各種常見用例的示例,例如 WMI、磁碟管理、外殼整合和系統對話方塊。
許多其他包在此基礎上構建,為 Windows 登錄檔、遊戲手柄支援、生物特徵儲存、工作列整合 和 序列埠訪問 提供符合習慣的 Dart 訪問,僅舉幾例。
更廣泛地說,許多其他 支援 Windows 的包,包括常用包,如 url_launcher、shared_preferences、file_selector 和 path_provider。
支援 Windows UI 指南
#雖然您可以選擇任何視覺樣式或主題,包括 Material Design,但有些應用作者可能希望構建一個符合 Microsoft Fluent 設計系統約定的應用。fluent_ui 包是 Flutter 收藏,它支援現代 Windows 應用中常見的視覺效果和常用控制元件,包括導航檢視、內容對話方塊、彈出視窗、日期選擇器和樹檢視小部件。
此外,Microsoft 還提供了 fluentui_system_icons,這是一個包,可輕鬆訪問數千個 Fluent 圖示,供您的 Flutter 應用使用。
最後,bitsdojo_window 包支援“所有者繪製”標題欄,允許您用自定義標題欄替換標準的 Windows 標題欄,以匹配應用的其餘部分。
自定義 Windows Host 應用
#當您建立 Windows 應用時,Flutter 會生成一個小的 C++ 應用程式來託管 Flutter。這個“執行器應用”負責建立和調整傳統 Win32 視窗的大小、初始化 Flutter 引擎和任何原生外掛,以及執行 Windows 訊息迴圈(將相關訊息傳遞給 Flutter 進行進一步處理)。
當然,您可以根據需要對這些程式碼進行更改,包括修改應用名稱和圖示,以及設定視窗的初始大小和位置。相關程式碼位於 main.cpp 中,您會找到類似以下的程式碼:
Win32Window::Point origin(10, 10);
Win32Window::Size size(1280, 720);
if (!window.CreateAndShow(L"myapp", origin, size))
{
return EXIT_FAILURE;
}將 myapp 替換為您希望在 Windows 標題欄中顯示的標題,並可選擇調整尺寸和視窗座標。
要更改 Windows 應用圖示,請將 windows\runner\resources 目錄中的 app_icon.ico 檔案替換為您喜歡的圖示。
可以透過編輯 windows/CMakeLists.txt 中的 BINARY_NAME 變數來更改生成的 Windows 可執行檔名。
cmake_minimum_required(VERSION 3.14)
project(windows_desktop_app LANGUAGES CXX)
# The name of the executable created for the application.
# Change this to change the on-disk name of your application.
set(BINARY_NAME "YourNewApp")
cmake_policy(SET CMP0063 NEW)當您執行 flutter build windows 時,在 build\windows\runner\Release 目錄中生成的可執行檔名將與新指定的名稱匹配。
最後,應用可執行檔案本身的更多屬性可以在 windows\runner 目錄的 Runner.rc 檔案中找到。在這裡,您可以更改嵌入在 Windows 應用中的版權資訊和應用程式版本,這些資訊顯示在 Windows Explorer 屬性對話方塊中。要更改版本號,請編輯 VERSION_AS_NUMBER 和 VERSION_AS_STRING 屬性;其他資訊可以在 StringFileInfo 塊中進行編輯。
使用 Visual Studio 編譯
#對於大多數應用,允許 Flutter 使用 flutter run 和 flutter build 命令處理編譯過程就足夠了。如果您對執行器應用進行了重大更改或將 Flutter 整合到現有應用中,您可能希望在 Visual Studio 本身中載入或編譯 Flutter 應用。
請按照以下步驟操作:
執行
flutter build windows以建立build\目錄。開啟 Windows 執行器的 Visual Studio 解決方案檔案,該檔案現在位於
build\windows目錄中,並根據父 Flutter 應用命名。在“解決方案資源管理器”中,您會看到多個專案。右鍵單擊與 Flutter 應用同名的專案,然後選擇“設定為啟動專案”。
要生成必要的依賴項,請執行“生成”>“生成解決方案”。
您也可以按 / Ctrl + Shift + B。
要從 Visual Studio 執行 Windows 應用,請轉到“除錯”>“開始除錯”。
你也可以按 F5。
使用工具欄根據需要切換“除錯”和“釋出”配置。
分發 Windows 應用
#您可以使用各種方法分發您的 Windows 應用程式。以下是一些選項:
- 使用工具為您的應用程式構建 MSIX 安裝程式(下一節介紹),並透過 Microsoft Windows 應用商店進行分發。您無需為此選項手動建立簽名證書,因為它會為您處理。
- 構建 MSIX 安裝程式並透過您自己的網站進行分發。對於此選項,您需要為應用程式提供
.pfx證書形式的數字簽名。 - 收集所有必需的元件並構建自己的 zip 檔案。
MSIX 打包
#MSIX 是新的 Windows 應用程式包格式,它提供了一種現代化的打包格式和安裝程式。此格式可用於將應用程式分發到 Microsoft Store,也可以直接分發應用程式安裝程式。
為 Flutter 專案建立 MSIX 分發的最佳方法是使用 msix pub 包。有關從 Flutter 桌面應用使用 msix 包的示例,請參閱 Desktop Photo Search 示例。
為本地測試建立自簽名 .pfx 證書
#對於透過 MSIX 安裝程式進行的私有部署和測試,您需要為應用程式提供 .pfx 證書形式的數字簽名。
透過 Windows Store 分發應用程式不需要生成 .pfx 證書。Windows Store 會為分發到其商店的應用程式處理證書的建立和管理。
透過將應用程式自我託管在網站上進行分發,需要由 Windows 信任的證書頒發機構簽名的證書。
使用以下說明生成自簽名 .pfx 證書。
- 如果尚未安裝,請下載 OpenSSL 工具包來生成您的證書。
- 轉到 OpenSSL 的安裝位置,例如
C:\Program Files\OpenSSL-Win64\bin。 - 設定一個環境變數,以便您可以從任何地方訪問
OpenSSL。
"C:\Program Files\OpenSSL-Win64\bin" - 如下生成私鑰:
openssl genrsa -out mykeyname.key 2048 - 使用私鑰生成證書籤名請求 (CSR) 檔案:
openssl req -new -key mykeyname.key -out mycsrname.csr - 使用私鑰和 CSR 檔案生成簽名證書 (CRT) 檔案:
openssl x509 -in mycsrname.csr -out mycrtname.crt -req -signkey mykeyname.key -days 10000 - 使用私鑰和 CRT 檔案生成
.pfx檔案:
openssl pkcs12 -export -out CERTIFICATE.pfx -inkey mykeyname.key -in mycrtname.crt - 在安裝應用程式之前,請先在本地計算機的
證書儲存中將.pfx證書安裝為受信任的根證書頒發機構。
構建自己的 Windows Zip 檔案
#Flutter 可執行檔案 .exe 可以在專案中的 build\windows\runner\<build mode>\ 找到。除了該可執行檔案外,您還需要以下內容:
來自同一目錄
- 所有
.dll檔案 data目錄
- 所有
Visual C++ 可再發行元件。您可以使用 Microsoft 網站上的 部署示例演練 中顯示的任何方法,以確保終端使用者擁有 C++ 可再發行元件。如果使用
application-local選項,則需要複製:msvcp140.dllvcruntime140.dllvcruntime140_1.dll
將 DLL 檔案放置在可執行檔案和其他 DLL 檔案旁邊的目錄中,並將它們捆綁在一個 zip 檔案中。生成的結構看起來如下:
Release │ flutter_windows.dll │ msvcp140.dll │ my_app.exe │ vcruntime140.dll │ vcruntime140_1.dll │ └───data │ │ app.so │ │ icudtl.dat ...
此時,如果需要,可以將此資料夾新增到 Inno Setup、WiX 等 Windows 安裝程式中,這相對簡單。
額外資源
#要了解如何使用 Inno Setup 構建 .exe 來分發您的 Flutter 桌面應用(適用於 Windows),請檢視分步 Windows 打包指南。