使用 Flutter 构建 Windows 应用程序

此页面讨论了使用 Flutter 构建 Windows 应用程序的独特注意事项,包括 shell 集成和通过 Windows 上的 Microsoft Store 分发 Windows 应用程序。

与 Windows 集成

Windows 编程接口结合了传统的 Win32 API、COM 接口和更现代的 Windows 运行时库。由于所有这些都提供了基于 C 的 ABI,因此可以使用 Dart 的外部函数接口库 (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,但一些应用程序作者可能希望构建一个符合 Microsoft 的 Fluent 设计系统 惯例的应用程序。fluent_ui 包(一个 Flutter Favorite)为现代 Windows 应用程序中常见的视觉效果和控件提供支持,包括导航视图、内容对话框、弹出窗口、日期选择器和树视图小部件。

此外,Microsoft 提供 fluentui_system_icons,这是一个包,可轻松访问数千个 Fluent 图标,以便在你的 Flutter 应用程序中使用。

最后,bitsdojo_window 包为“所有者绘制”标题栏提供支持,允许你用一个与应用程序的其余部分匹配的自定义标题栏替换标准 Windows 标题栏。

自定义 Windows 主机应用程序

创建 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;
}

用你希望在 Windows 标题栏中显示的标题替换 myapp,还可以根据需要调整大小和窗口坐标的维度。

要更改 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 资源管理器属性对话框中。要更改版本号,请编辑 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 应用程序包格式,提供了一种现代的打包格式和安装程序。此格式既可用于将应用程序发送到 Windows 上的 Microsoft Store,也可以直接分发应用程序安装程序。

为 Flutter 项目创建 MSIX 分发的最简单方法是使用 msix pub 包。有关从 Flutter 桌面应用使用 msix 包的示例,请参阅 桌面照片搜索 示例。

为本地测试创建自签名 .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
    
    ...
    

在这一点上,如果需要,将此文件夹添加到 Windows 安装程序(例如 Inno Setup、WiX 等)会相对简单。