跳到主內容

使用 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 應用提供了使用 malloccalloc 分配本機記憶體、支援指標、結構體和回撥以及 ABI 型別(如 longsize_t)的能力。

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

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

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

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

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

使用 Visual Studio 編譯

#

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

請按照以下步驟操作

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

  2. 開啟 Windows runner 的 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 應用程式包格式,提供了一種現代的打包格式和安裝程式。這種格式可以用於將應用程式運送到 Windows 上的 Microsoft Store,或者您可以直接分發應用程式安裝程式。

建立 Flutter 專案的 MSIX 分發的 easiest 方法是使用 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. 在安裝應用程式之前,首先在本地機器的 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.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
    
    ...
    

此時,如果需要,將此資料夾新增到 Windows 安裝程式(如 Inno Setup、WiX 等)會相對簡單。

額外資源

#

要了解如何使用 Inno Setup 構建 .exe 以分發您的 Flutter Windows 桌面應用程式,請檢視循序漸進的 Windows 打包指南