本頁討論使用 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 應用提供了使用 malloccalloc 分配原生記憶體的能力,支援指標、結構體和回撥,以及 longsize_t 等 ABI 型別。

有關從 Flutter 呼叫 C 庫的更多資訊,請參閱 使用 dart:ffi 進行 C 互操作

實際上,雖然透過這種方式從 Dart 呼叫基本的 Win32 API 相對簡單,但使用封裝庫來抽象 COM 程式設計模型的複雜性會更容易。 win32 包 提供了一個用於訪問數千個常用 Windows API 的庫,它使用 Microsoft 提供的元資料以保持一致性和正確性。該包還包括各種常見用例的示例,例如 WMI、磁碟管理、外殼整合和系統對話方塊。

許多其他包在此基礎上構建,為 Windows 登錄檔遊戲手柄支援生物特徵儲存工作列整合序列埠訪問 提供符合習慣的 Dart 訪問,僅舉幾例。

更廣泛地說,許多其他 支援 Windows 的包,包括常用包,如 url_launchershared_preferencesfile_selectorpath_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 中,您會找到類似以下的程式碼:

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
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_NUMBERVERSION_AS_STRING 屬性;其他資訊可以在 StringFileInfo 塊中進行編輯。

使用 Visual Studio 編譯

#

對於大多數應用,允許 Flutter 使用 flutter runflutter build 命令處理編譯過程就足夠了。如果您對執行器應用進行了重大更改或將 Flutter 整合到現有應用中,您可能希望在 Visual Studio 本身中載入或編譯 Flutter 應用。

請按照以下步驟操作:

  1. 執行 flutter build windows 以建立 build\ 目錄。

  2. 開啟 Windows 執行器的 Visual Studio 解決方案檔案,該檔案現在位於 build\windows 目錄中,並根據父 Flutter 應用命名。

  3. 在“解決方案資源管理器”中,您會看到多個專案。右鍵單擊與 Flutter 應用同名的專案,然後選擇“設定為啟動專案”。

  4. 要生成必要的依賴項,請執行“生成”>“生成解決方案”。

    您也可以按 / Ctrl + Shift + B

    要從 Visual Studio 執行 Windows 應用,請轉到“除錯”>“開始除錯”。

    你也可以按 F5

  5. 使用工具欄根據需要切換“除錯”和“釋出”配置。

分發 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 證書。

  1. 如果尚未安裝,請下載 OpenSSL 工具包來生成您的證書。
  2. 轉到 OpenSSL 的安裝位置,例如 C:\Program Files\OpenSSL-Win64\bin
  3. 設定一個環境變數,以便您可以從任何地方訪問 OpenSSL
    "C:\Program Files\OpenSSL-Win64\bin"
  4. 如下生成私鑰:
    openssl genrsa -out mykeyname.key 2048
  5. 使用私鑰生成證書籤名請求 (CSR) 檔案:
    openssl req -new -key mykeyname.key -out mycsrname.csr
  6. 使用私鑰和 CSR 檔案生成簽名證書 (CRT) 檔案:
    openssl x509 -in mycsrname.csr -out mycrtname.crt -req -signkey mykeyname.key -days 10000
  7. 使用私鑰和 CRT 檔案生成 .pfx 檔案:
    openssl pkcs12 -export -out CERTIFICATE.pfx -inkey mykeyname.key -in mycrtname.crt
  8. 在安裝應用程式之前,請先在本地計算機的 證書儲存 中將 .pfx 證書安裝為 受信任的根證書頒發機構

構建自己的 Windows Zip 檔案

#

Flutter 可執行檔案 .exe 可以在專案中的 build\windows\runner\<build mode>\ 找到。除了該可執行檔案外,您還需要以下內容:

  • 來自同一目錄

    • 所有 .dll 檔案
    • data 目錄
  • Visual C++ 可再發行元件。您可以使用 Microsoft 網站上的 部署示例演練 中顯示的任何方法,以確保終端使用者擁有 C++ 可再發行元件。如果使用 application-local 選項,則需要複製:

    • msvcp140.dll
    • vcruntime140.dll
    • vcruntime140_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 打包指南