使用 Flutter 构建 Windows 应用
使用 Flutter 进行 Windows 构建时需注意的平台特定事项。
本页面讨论了使用 Flutter 构建 Windows 应用时的一些独特注意事项,包括 Shell 集成以及通过 Microsoft Store 分发 Windows 应用的相关内容。
集成 Windows
#Windows 编程接口结合了传统的 Win32 API、COM 接口以及更现代的 Windows Runtime 库。由于这些接口均提供基于 C 的 ABI,因此你可以使用 Dart 的外部函数接口库 (dart:ffi) 来调用操作系统提供的服务。FFI 旨在使 Dart 程序能够高效地调用 C 语言库。它为 Flutter 应用提供了使用 malloc 或 calloc 分配原生内存的能力,并支持指针、结构体、回调以及 long 和 size_t 等 ABI 类型。
有关从 Flutter 调用 C 库的更多信息,请参阅 使用 dart:ffi 进行 C 互操作。
在实践中,虽然通过这种方式从 Dart 调用基础的 Win32 API 相对直接,但使用能够抽象出 COM 编程模型复杂性的包装库会更加容易。win32 软件包 提供了一个用于访问数千个常见 Windows API 的库,并使用微软提供的元数据来确保一致性和正确性。该软件包还包含了各种常见用例的示例,例如 WMI、磁盘管理、Shell 集成和系统对话框。
许多其他软件包也建立在此基础之上,为 Windows 注册表、游戏手柄支持、生物识别存储、任务栏集成 和 串口访问 等提供地道的 Dart 访问方式,这仅仅是其中几个例子。
更广泛地讲,许多其他 支持 Windows 的软件包 也已可用,包括 url_launcher、shared_preferences、file_selector 和 path_provider 等常用包。
遵循 Windows UI 指南
#虽然你可以选择任何视觉样式或主题(包括 Material Design),但一些应用作者可能希望构建符合微软 Fluent 设计系统 规范的应用。fluent_ui 软件包是一个 Flutter Favorite,它为现代 Windows 应用中常见的视觉效果和控件提供了支持,包括导航视图、内容对话框、弹出窗口、日期选择器和树状视图控件。
此外,微软还提供了 fluentui_system_icons,这是一个可以让你在 Flutter 应用中轻松调用数千个 Fluent 图标的软件包。
最后,bitsdojo_window 软件包提供了对“自绘 (owner draw)”标题栏的支持,允许你用自定义标题栏替换标准的 Windows 标题栏,使其与应用的整体风格保持一致。
自定义 Windows 宿主应用
#当你创建一个 Windows 应用时,Flutter 会生成一个承载 Flutter 的小型 C++ 应用程序。这个“运行程序 (runner app)”负责创建和调整传统的 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;
}
将 myapp 替换为你希望在 Windows 标题栏中显示的标题,并可根据需要调整尺寸和窗口坐标。
要更改 Windows 应用程序图标,请将 windows\runner\resources 目录中的 app_icon.ico 文件替换为你想要的图标。
生成的 Windows 可执行文件名可以通过编辑 windows/CMakeLists.txt 中的 BINARY_NAME 变量来修改。
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_NUMBER 和 VERSION_AS_STRING 属性;其他信息可以在 StringFileInfo 块中进行编辑。
使用 Visual Studio 编译
#对于大多数应用,使用 flutter run 和 flutter build 命令让 Flutter 处理编译过程就足够了。如果你对运行程序进行了重大修改,或者需要将 Flutter 集成到现有的应用中,你可能希望在 Visual Studio 中加载或编译该 Flutter 应用。
请按照以下步骤操作:
运行
flutter build windows以创建build\目录。-
打开 Windows 运行程序的 Visual Studio 解决方案文件,它现在位于
build\windows目录中,文件名取决于你的 Flutter 应用名称。 -
在解决方案资源管理器中,你会看到多个项目。右键点击与 Flutter 应用同名的项目,然后选择设为启动项目 (Set as Startup Project)。
-
要生成必要的依赖项,请选择生成 (Build) > 生成解决方案 (Build Solution)。
你也可以按 Ctrl + Shift + B。
要从 Visual Studio 运行 Windows 应用,请转到调试 (Debug) > 开始调试 (Start Debugging)。
你也可以按 F5。
-
使用工具栏根据需要切换 Debug 和 Release 配置。
分发 Windows 应用
#分发 Windows 应用程序有多种方法,以下是一些选项:
- 使用工具构建 MSIX 安装程序(在下一节中描述)并将其通过 Microsoft Windows 应用商店分发。此选项不需要手动创建签名证书,因为它会为你自动处理。
- 构建 MSIX 安装程序并通过你自己的网站分发。对于此选项,你需要以
.pfx证书的形式为应用程序提供数字签名。 - 收集所有必要组件并构建你自己的 zip 文件。
MSIX 打包
#MSIX 是新的 Windows 应用程序包格式,提供了现代化的打包格式和安装程序。这种格式既可用于向 Windows 应用商店发布应用程序,也可用于直接分发应用安装程序。
为 Flutter 项目创建 MSIX 分发包的最简单方法是使用 msix pub 软件包。有关在 Flutter 桌面应用中使用 msix 软件包的示例,请参阅 Desktop Photo Search 示例。
为本地测试创建自签名 .pfx 证书
#对于私有部署和使用 MSIX 安装程序进行测试,你需要以 .pfx 证书的形式为应用程序提供数字签名。
通过 Windows 应用商店进行部署时,不需要生成 .pfx 证书。Windows 应用商店会处理通过其商店分发的应用程序的证书创建和管理工作。
通过自己的网站托管来分发应用程序,需要一个由 Windows 所信任的证书颁发机构 (CA) 签名的证书。
请按照以下说明生成自签名 .pfx 证书。
- 如果尚未安装,请下载 OpenSSL 工具包以生成证书。
- 进入 OpenSSL 的安装目录,例如
C:\Program Files\OpenSSL-Win64\bin。 - 设置环境变量,以便你可以从任何位置访问
OpenSSL:
"C:\Program Files\OpenSSL-Win64\bin" - 按如下方式生成私钥:
openssl genrsa -out mykeyname.key 2048 - 使用私钥生成证书签名请求 (CSR) 文件:
openssl req -new -key mykeyname.key -out mycsrname.csr - 使用私钥和 CSR 文件生成已签名的证书 (CRT) 文件:
openssl x509 -in mycsrname.csr -out mycrtname.crt -req -signkey mykeyname.key -days 10000 - 使用私钥和 CRT 文件生成
.pfx文件:
openssl pkcs12 -export -out CERTIFICATE.pfx -inkey mykeyname.key -in mycrtname.crt - 在安装应用之前,请先在本地计算机的“证书存储”中将
.pfx证书安装为“受信任的根证书颁发机构”。
为 Windows 构建自定义 zip 文件
#Flutter 可执行文件 (.exe) 位于项目的 build\windows\runner\<build mode>\ 目录下。除了该可执行文件,你还需要以下内容:
-
来自同一目录的:
- 所有
.dll文件 data目录
- 所有
-
Visual C++ 可再发行组件。你可以使用微软网站上部署示例演练中展示的任何方法,以确保最终用户拥有 C++ 可再发行组件。如果你使用
application-local选项,则需要复制:msvcp140.dllvcruntime140.dllvcruntime140_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 打包指南。