跳至主要内容

使用 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 可执行文件名可以通过编辑 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 命令处理编译过程即可。如果您对运行器应用进行了重大更改或将 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 证书的形式为您的应用程序提供数字签名。
  • 收集所有必要的组件并构建您自己的压缩文件。

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 压缩文件

#

Flutter 可执行文件 .exe 可以在您项目的 build\windows\runner\<build mode>\ 下找到。除了该可执行文件之外,您还需要以下内容:

  • 来自同一目录

    • 所有 .dll 文件
    • data 目录
  • Visual C++ 可再发行组件。您可以使用 Microsoft 站点上的 部署示例演练 中显示的任何方法,以确保最终用户拥有 C++ 可再发行组件。如果您使用 application-local 选项,则需要复制

    • msvcp140.dll
    • vcruntime140.dll
    • vcruntime140_1.dll

    将 DLL 文件放在可执行文件和其他 DLL 旁边的目录中,并将它们捆绑到一个压缩文件中。生成的结构如下所示:

    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 打包指南