Skip to main content

使用 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、磁盘管理、shell 集成和系统对话框。

许多其他包都基于此基础构建,为Windows 注册表游戏手柄支持生物识别存储任务栏集成串口访问提供了惯用的 Dart 访问权限,仅举几例。

更一般地说,许多其他包支持 Windows,包括常见的包,例如 url_launchershared_preferencesfile_selectorpath_provider

支持 Windows UI 指南

#

虽然您可以使用任何您选择的视觉样式或主题,包括 Material,但某些应用作者可能希望构建一个符合 Microsoft 的Fluent 设计系统约定的应用。fluent_ui 包(一个Flutter 精选)提供了对现代 Windows 应用中常见的视觉效果和常用控件的支持,包括导航视图、内容对话框、弹出菜单、日期选择器和树视图小部件。

此外,Microsoft 提供了fluentui_system_icons,这是一个提供轻松访问数千个 Fluent 图标以用于 Flutter 应用的包。

最后,bitsdojo_window 包支持“自定义绘制”标题栏,允许您用与应用其余部分匹配的自定义标题栏替换标准 Windows 标题栏。

自定义 Windows 宿主应用程序

#

创建 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)

# 应用程序创建的可执行文件的名称。
# 更改此项以更改应用程序的磁盘上名称。
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 应用商店进行部署,不需要生成 .pfx 证书。Windows 应用商店负责创建和管理通过其商店分发的应用程序的证书。

通过在网站上自行托管来分发您的应用程序需要一个由 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 等)中将相对简单。

其他资源

#

要了解如何使用 Inno Setup 构建 .exe 以分发您的 Windows Flutter 桌面应用,请查看分步Windows 打包指南