使用 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 应用提供了使用 malloc 或 calloc 分配本机内存、支持指针、结构体和回调以及 ABI 类型(如 long 和 size_t)的能力。
有关从 Flutter 调用 C 库的更多信息,请参阅 使用 dart:ffi 进行 C 互操作。
在实践中,虽然以这种方式从 Dart 调用基本的 Win32 API 相对简单,但使用抽象 COM 编程模型的复杂性的包装库更容易。 win32 包 提供了一个库,用于访问数千个常见的 Windows API,使用 Microsoft 提供的元数据以确保一致性和正确性。该包还包括各种常见用例的示例,例如 WMI、磁盘管理、shell 集成和系统对话框。
许多其他包在此基础上构建,为 Windows 注册表、游戏手柄支持、生物识别存储、任务栏集成 和 串行端口访问 提供惯用的 Dart 访问,仅举几个例子。
更普遍地说,许多其他 包支持 Windows,包括常用的包,例如 url_launcher、shared_preferences、file_selector 和 path_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 中,您将找到类似以下的代码
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 使用 flutter run 和 flutter build 命令处理编译过程就足够了。如果您对 runner 应用进行重大更改或将 Flutter 集成到现有应用中,您可能希望在 Visual Studio 本身中加载或编译 Flutter 应用。
请按照以下步骤操作
运行
flutter build windows以创建build\目录。-
打开 Windows runner 的 Visual Studio 解决方案文件,现在可以在
build\windows目录中找到,并根据父 Flutter 应用命名。 -
在解决方案资源管理器中,您将看到许多项目。右键单击与 Flutter 应用同名的项目,然后选择 设置为启动项目。
-
要生成必要的依赖项,请运行 生成 > 生成解决方案
您还可以按/ Ctrl + Shift + B。
要从 Visual Studio 运行 Windows 应用,请转到 调试 > 开始调试。
你也可以按 F5。
-
使用工具栏在调试和发布配置之间切换,如适当。
分发 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 证书。
- 如果您尚未下载,请下载 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 - 在安装应用程序之前,首先在本地机器的
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.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 ...
此时,如果需要,将此文件夹添加到 Windows 安装程序(如 Inno Setup、WiX 等)会相对简单。
额外资源
#要了解如何使用 Inno Setup 构建 .exe 以分发您的 Flutter Windows 桌面应用程序,请查看循序渐进的 Windows 打包指南。