使用 Flutter 构建 Windows 应用
本页讨论使用 Flutter 构建 Windows 应用的独特注意事项,包括外壳集成以及通过 Microsoft Store 在 Windows 上分发 Windows 应用。
集成 Windows
#Windows 编程接口结合了传统的 Win32 API、COM 接口以及更现代的 Windows Runtime 库。由于所有这些都提供了基于 C 的 ABI,您可以使用 Dart 的 Foreign Function Interface 库(dart:ffi
)调用操作系统提供的服务。FFI 旨在使 Dart 程序能够高效地调用 C 库。它为 Flutter 应用提供了使用 malloc
或 calloc
分配原生内存的能力,支持指针、结构体和回调,以及 long
和 size_t
等 ABI 类型。
有关从 Flutter 调用 C 库的更多信息,请参阅 使用 dart:ffi
进行 C 互操作。
实际上,虽然通过这种方式从 Dart 调用基本的 Win32 API 相对简单,但使用封装库来抽象 COM 编程模型的复杂性会更容易。 win32 包 提供了一个用于访问数千个常用 Windows API 的库,它使用 Microsoft 提供的元数据以保持一致性和正确性。该包还包括各种常见用例的示例,例如 WMI、磁盘管理、外壳集成和系统对话框。
许多其他包在此基础上构建,为 Windows 注册表、游戏手柄支持、生物特征存储、任务栏集成 和 串行端口访问 提供符合习惯的 Dart 访问,仅举几例。
更广泛地说,许多其他 支持 Windows 的包,包括常用包,如 url_launcher
、shared_preferences
、file_selector
和 path_provider
。
支持 Windows UI 指南
#虽然您可以选择任何视觉样式或主题,包括 Material Design,但有些应用作者可能希望构建一个符合 Microsoft Fluent 设计系统约定的应用。fluent_ui 包是 Flutter 收藏,它支持现代 Windows 应用中常见的视觉效果和常用控件,包括导航视图、内容对话框、弹出窗口、日期选择器和树视图小部件。
此外,Microsoft 还提供了 fluentui_system_icons,这是一个包,可轻松访问数千个 Fluent 图标,供您的 Flutter 应用使用。
最后,bitsdojo_window 包支持“所有者绘制”标题栏,允许您用自定义标题栏替换标准的 Windows 标题栏,以匹配应用的其余部分。
自定义 Windows Host 应用
#当您创建 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;
}
将 myapp
替换为您希望在 Windows 标题栏中显示的标题,并可选择调整尺寸和窗口坐标。
要更改 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 Explorer 属性对话框中。要更改版本号,请编辑 VERSION_AS_NUMBER
和 VERSION_AS_STRING
属性;其他信息可以在 StringFileInfo
块中进行编辑。
使用 Visual Studio 编译
#对于大多数应用,允许 Flutter 使用 flutter run
和 flutter build
命令处理编译过程就足够了。如果您对运行器应用进行了重大更改或将 Flutter 集成到现有应用中,您可能希望在 Visual Studio 本身中加载或编译 Flutter 应用。
请按照以下步骤操作:
运行
flutter build windows
以创建build\
目录。打开 Windows 运行器的 Visual Studio 解决方案文件,该文件现在位于
build\windows
目录中,并根据父 Flutter 应用命名。在“解决方案资源管理器”中,您会看到多个项目。右键单击与 Flutter 应用同名的项目,然后选择“设置为启动项目”。
要生成必要的依赖项,请运行“生成”>“生成解决方案”。
您也可以按 / Ctrl + Shift + B。
要从 Visual Studio 运行 Windows 应用,请转到“调试”>“开始调试”。
你也可以按 F5。
使用工具栏根据需要切换“调试”和“发布”配置。
分发 Windows 应用
#您可以使用各种方法分发您的 Windows 应用程序。以下是一些选项:
- 使用工具为您的应用程序构建 MSIX 安装程序(下一节介绍),并通过 Microsoft Windows 应用商店进行分发。您无需为此选项手动创建签名证书,因为它会为您处理。
- 构建 MSIX 安装程序并通过您自己的网站进行分发。对于此选项,您需要为应用程序提供
.pfx
证书形式的数字签名。 - 收集所有必需的组件并构建自己的 zip 文件。
MSIX 打包
#MSIX 是新的 Windows 应用程序包格式,它提供了一种现代化的打包格式和安装程序。此格式可用于将应用程序分发到 Microsoft Store,也可以直接分发应用程序安装程序。
为 Flutter 项目创建 MSIX 分发的最佳方法是使用 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
- 在安装应用程序之前,请先在本地计算机的
证书存储
中将.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 ...
此时,如果需要,可以将此文件夹添加到 Inno Setup、WiX 等 Windows 安装程序中,这相对简单。
额外资源
#要了解如何使用 Inno Setup 构建 .exe
来分发您的 Flutter 桌面应用(适用于 Windows),请查看分步 Windows 打包指南。