使用 Flutter 構建 Windows 應用
使用 Flutter 構建 Windows 應用的平臺特定注意事項。
本頁討論了使用 Flutter 構建 Windows 應用的獨特注意事項,包括 shell 整合以及透過 Windows 上的 Microsoft Store 分發 Windows 應用。
與 Windows 整合
#Windows 程式設計介面結合了傳統的 Win32 API、COM 介面和更現代的 Windows Runtime 庫。由於所有這些都提供基於 C 的 ABI,因此可以使用 Dart 的 Foreign Function Interface 庫 (dart:ffi) 呼叫作業系統提供的服務。FFI 旨在使 Dart 程式能夠有效地呼叫 C 庫。它為 Flutter 應用提供了使用 malloc 或 calloc 分配本機記憶體、支援指標、結構體和回撥以及 ABI 型別(如 long 和 size_t)的能力。
有關從 Flutter 呼叫 C 庫的更多資訊,請參閱 使用 dart:ffi 進行 C 互操作。
在實踐中,雖然以這種方式從 Dart 呼叫基本的 Win32 API 相對簡單,但使用抽象 COM 程式設計模型的複雜性的包裝庫更容易。 win32 包 提供了一個庫,用於訪問數千個常見的 Windows API,使用 Microsoft 提供的元資料以確保一致性和正確性。該包還包括各種常見用例的示例,例如 WMI、磁碟管理、shell 整合和系統對話方塊。
許多其他包在此基礎上構建,為 Windows 登錄檔、遊戲手柄支援、生物識別儲存、工作列整合 和 序列埠訪問 提供慣用的 Dart 訪問,僅舉幾個例子。
更普遍地說,許多其他 包支援 Windows,包括常用的包,例如 url_launcher、shared_preferences、file_selector 和 path_provider。
遵循 Windows UI 指南
#雖然可以使用任何視覺風格或主題,包括 Material,但有些應用作者可能希望構建與 Microsoft 的 Fluent 設計系統 約定匹配的應用。 fluent_ui 包,一個 Flutter Favorite,為現代 Windows 應用中常見的視覺效果和常用控制元件提供支援,包括導航檢視、內容對話方塊、飛出視窗、日期選擇器和樹狀檢視小部件。
此外,Microsoft 還提供 fluentui_system_icons,一個提供易於訪問數千個 Fluent 圖示的包,用於在您的 Flutter 應用中使用。
最後,bitsdojo_window 包提供對“所有者繪製”標題欄的支援,允許您用與應用其餘部分匹配的自定義標題欄替換標準的 Windows 標題欄。
自定義 Windows 主機應用程式
#當您建立一個 Windows 應用時,Flutter 會生成一個小的 C++ 應用來託管 Flutter。這個“runner 應用”負責建立和調整傳統的 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 可執行檔名可以透過編輯 windows/CMakeLists.txt 中的 BINARY_NAME 變數來更改
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 資源管理器屬性對話方塊中。要更改版本號,請編輯 VERSION_AS_NUMBER 和 VERSION_AS_STRING 屬性;其他資訊可以在 StringFileInfo 塊中編輯。
使用 Visual Studio 編譯
#對於大多數應用,讓 Flutter 使用 flutter run 和 flutter build 命令處理編譯過程就足夠了。如果您對 runner 應用進行重大更改或將 Flutter 整合到現有應用中,您可能希望在 Visual Studio 本身中載入或編譯 Flutter 應用。
請按照以下步驟操作
執行
flutter build windows以建立build\目錄。-
開啟 Windows runner 的 Visual Studio 解決方案檔案,現在可以在
build\windows目錄中找到,並根據父 Flutter 應用命名。 -
在解決方案資源管理器中,您將看到許多專案。右鍵單擊與 Flutter 應用同名的專案,然後選擇 設定為啟動專案。
-
要生成必要的依賴項,請執行 生成 > 生成解決方案
您還可以按/ Ctrl + Shift + B。
要從 Visual Studio 執行 Windows 應用,請轉到 除錯 > 開始除錯。
你也可以按 F5。
-
使用工具欄在除錯和釋出配置之間切換,如適當。
分發 Windows 應用
#您可以使用各種方法來分發您的 Windows 應用程式。以下是一些選項
- 使用工具構建應用程式的 MSIX 安裝程式(在下一節中描述),並透過 Microsoft Windows 應用商店分發它。對於此選項,您不需要手動建立簽名證書,因為它為您處理。
- 構建 MSIX 安裝程式並透過您自己的網站分發它。對於此選項,您需要為您的應用程式提供數字簽名,形式為
.pfx證書。 - 收集所有必要的元件並構建您自己的 zip 檔案。
MSIX 打包
#MSIX,新的 Windows 應用程式包格式,提供了一種現代的打包格式和安裝程式。這種格式可以用於將應用程式運送到 Windows 上的 Microsoft Store,或者您可以直接分發應用程式安裝程式。
建立 Flutter 專案的 MSIX 分發的 easiest 方法是使用 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 - 在安裝應用程式之前,首先在本地機器的
Certificate store中安裝.pfx證書,作為Trusted Root Certification Authorities。
為 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 ...
此時,如果需要,將此資料夾新增到 Windows 安裝程式(如 Inno Setup、WiX 等)會相對簡單。
額外資源
#要了解如何使用 Inno Setup 構建 .exe 以分發您的 Flutter Windows 桌面應用程式,請檢視循序漸進的 Windows 打包指南。