原生Windows应用编译,一些早期的插件,以及一个桌面就绪的Flutter Gallery应用。
发布时间:9月23日 - 11分钟阅读
我们的使命是为开发者提供一个开源、高生产力的框架,以便在任何平台上构建漂亮的原生应用。到目前为止,我们已经为Android和iOS提供了生产质量的支持,有8个稳定的版本,仅Google Play商店就有超过10万个应用被运到。我们将继续扩大我们的关注点,以包括其他平台,包括web、macOS和Linux。今天,我们很高兴地宣布Flutter的另一个目标,即Flutter支持Windows的alpha版本。
Windows仍然是台式机和笔记本电脑设备的热门选择,微软报告说有超过10亿台活跃设备在运行Windows 10。我们自己的统计数据显示,超过一半的Flutter开发者使用Windows,所以它是Flutter的自然目标。原生桌面支持为Flutter开辟了各种令人兴奋的可能性,包括改进开发者工具,减少新用户的摩擦,当然还有可以从单一代码库到达用户可能拥有的任何设备的应用程序。
将Windows添加到Flutter
正如我们在架构概述中所描述的那样,Flutter是一个跨平台的UI工具包,旨在允许跨iOS和Android等操作系统的代码重用,同时也允许应用程序直接与底层平台服务对接。其目标是让开发者能够交付在不同平台上感觉自然的高性能应用,拥抱存在差异的地方,同时尽可能多地共享代码。Flutter的核心是引擎,它支持支持所有Flutter应用所需的基元。每当需要绘制新的帧时,该引擎负责栅格化合成场景。它提供Flutter核心API的低级实现,包括图形、文本布局、文件和网络I/O、可访问性支持、插件架构以及Dart运行时和编译工具链。
我们为Flutter添加的每一个新平台都会用新的服务来扩展核心框架,使其在该平台上大放异彩。我们在Android和iOS上开始使用Material Design以及基于触控的、以移动为中心的用户界面,在这两个移动平台上设计成像素完美。在web、Windows、macOS和Linux上增加对桌面形式因素的支持,带来了一套全新的服务,包括对输入端的键盘、鼠标、鼠标滚轮和控制器的强大支持,以及能适应甚至最好地适应web和桌面应用所带来的更大屏幕尺寸的小部件。
此外,每个新的平台不仅仅影响Flutter框架和引擎,还影响了很多其他东西。
- 工具链更新:在CLI和IDE工具中添加一个新的目标(在这里是Windows)。
- Shell:支持通过
WM_*
消息处理来自Windows的输入,并通过ANGLE输出,使用Skia以本机速度渲染到底层的DirectX表面。 - Runner:每个项目都会得到一个支持目标的shell应用程序。对于Windows来说,它是一个Win32/C++程序,加载你的Flutter代码,并在运行时执行它。如果你需要的话,这是一个向你的应用程序添加本地代码的好地方。
- 插件。插件是Dart代码和插件支持的每个平台的本地代码的混合体。需要为每一个在Windows上编译到你的Flutter应用的插件添加该本机代码。
这个alpha版本提供了一个坚实的基础,我们将在未来几个月内稳定下来。随着对Windows 7及以上版本的支持,我们希望这能给富有冒险精神的开发者提供一些入门的机会。
探索一些示例应用程序
要想看到 Flutter 对 Windows 的支持,您可能想尝试一下我们创建的一些示例应用程序,这些应用程序在我们新添加的支持下在 Windows 上运行良好。第一个,Flokk应用程序,是与gskinner.com的设计师和开发人员共同创建的。我们的目标是通过创建一个创新的、漂亮的Flutter桌面应用来证明Flutter已经为桌面做好了准备。Flokk是一款与你的真实谷歌通讯录数据配合使用的应用,同时也可以显示你的联系人在GitHub和Twitter上的活动。
如果你想在Windows机器上使用Flokk应用,你可以在GitHub上下载最新版本。如果你想了解gskinner如何构建这个应用,请看他们的优秀博客文章。Flokk--我们如何使用Flutter构建一个桌面应用。
此外,Flutter Gallery应用,我们的Flutter所有东西的展示应用,最近被完全重写,以增加对桌面形式因素的支持。这使我们能够检查它在Web以及Windows、macOS和Linux上的工作情况。
图库中的许多研究展示了不同应用程序风格的想法,我们建议在使用Flutter设计自己的Windows应用程序时使用。当你找到你喜欢的东西时,代码可以在GitHub上找到。
开始使用Flutter for Windows
根据Windows安装说明安装Flutter SDK开始。要针对Windows桌面,首先需要安装桌面文档中描述的工具。默认情况下,Flutter假设你正在构建生产软件,并没有配置为开发Windows应用程序。然而,这很容易从命令行修复。
$ flutter channel dev
$ flutter upgrade
$ flutter config --enable-windows-desktop
第一个命令设置Flutter使用实验质量的 "dev "通道(而不是默认的 "stable "通道)。这允许你使用仍然在alpha的平台支持,比如Windows。第二条命令是将该通道上的最新位拉下来。第三条命令可以在你的PC上进行Windows应用开发。
一旦你设置好了,每次你创建一个新的Flutter应用,使用Android Studio或Visual Studio Code的扩展支持,或者从命令行创建一个windows子文件夹。
如果你好奇的话,在Windows上运行默认的应用是这样的。
最后,一旦你创建了你的应用程序,构建它就会创建一个释放模式、原生EXE文件以及必要的支持DLL。在这一点上,如果你想实验在任何Windows 10机器上运行你的新Windows应用程序,甚至那些没有安装Flutter的机器,你可以按照步骤压缩必要的文件,然后去。
Windows的插件
尽管我们刚刚达到alpha版本,Flutter社区已经在为Windows开发插件。这里有几个。
- url_launcher: 在浏览器中从你的应用中启动URLs。
- path_provider: 在用户的机器上找到特殊方向的路径,如Documents或temp。
- shared_preferences: 在应用程序的不同会话之间将用户的偏好设置序列化保存在磁盘上。
- biometric_storage: 通过生物识别技术加密的存储。
- flutter_audio_desktop: 从您的桌面应用程序中播放音频。
使用这些插件的好处是,它们中的大多数也支持其他Flutter平台,这使得你可以将你的应用程序瞄准Android、iOS、web等以及Windows。此外,虽然pub.dev(Dart和Flutter的包管理器)上约有三分之一的可用包是带有平台专用代码的插件,但大多数都不是。例如,许多质量最高、使用最多的包都是Flutter Favorite程序的一部分,而且大部分都能在Windows上使用。如果你想查看在Windows上运行的包的完整列表,你可以在pub.dev上运行这个查询。
与Windows的互操作
如果你想为Windows构建自己的插件,你可以。一旦你在开发频道,并且你的机器启用了Windows,你就可以用下面的命令开始。
$ flutter create --template plugin --platforms windows hello_plugin
在这一点上,你将能够将你的Flutter代码添加到lib
子文件夹中,并将你的Windows代码添加到插件项目的windows
子文件夹中。你将使用平台通道(Platform Channels)在两个堆栈之间进行通信,这本质上是Dart和C++代码之间的消息传递。对于一个精心制作的例子,请看url_launcher的实现。
然而,Platform Channels并不是你与Windows互操作的唯一选择。如果你愿意,你可以使用Dart FFI(外函数接口)来加载库和调用C风格的API,如Win32 API。与使用Platform Channels的url_launcher不同,path_provider插件是使用FFI实现的,你可以在GitHub repo中看到。FFI允许你写代码直接导入你想要的API,而不是在Dart和C++之间来回奔波。例如,这里是调用MessageBox API的代码。
typedef MessageBoxNative = Int32 Function(
IntPtr hWnd,
Pointer<Utf16> lpText,
Pointer<Utf16> lpCaption,
Int32 uType
);
typedef MessageBoxDart = int Function(
int hWnd,
Pointer<Utf16> lpText,
Pointer<Utf16> lpCaption,
int uType
);
final user32 = DynamicLibrary.open('user32.dll');
final win32MessageBox =
user32.lookupFunction<MessageBoxNative, MessageBoxDart>('MessageBoxW');
void showMessageBox(String message, String caption) =>
win32MessageBox(
0, // No owner window
Utf16.toUtf16(message), // Message
Utf16.toUtf16(caption), // Window title
0 // OK button only
);
...
// call just like any other Dart function
showMessageBox('Test Message', 'Window Caption');
这段代码不会像Platform Channels那样产生两个线程之间的过渡开销。FFI包括对许多不同种类的API的支持,包括Win32、WinRT和COM。但在你跑去包裹整个基于C的Windows API之前,请先看看win32插件,它已经很好地做到了这一点。事实上,path_provider插件本身就是使用win32插件实现的。关于win32插件的开发过程和工作原理,请查看博文《Dart FFI的Windows乐趣》。
Flutter for Windows资源
无论你在Windows的Flutter之旅,你都应该确保阅读flutter.dev上的桌面文档,其中包括最新的细节。此外,你还想通过Flutter codelab来编写针对Windows、macOS和Windows桌面的应用程序,其中包括使用OAuth进行身份验证、访问GitHub API和使用GraphQL等真实场景的代码。或者,如果想了解另一个在Windows上工作的Flutter桌面代码的好例子,请查看照片搜索样本。
它使用标准的Windows文件打开对话框、树形视图部件、分割器部件,并将结果与真实世界的REST API集成。
对于其他有用的面向桌面的小组件,我们推荐menubar插件、NavigationRail小组件和DataTable小组件。您可能也会对InteractiveViewer小组件感兴趣,它对鼠标手势平移和缩放子小组件有完全的桌面支持。
另一个可以探索的有用的小组件是来自SyncFusion的小组件,他们在Windows开发社区中已经很有名了。他们提供了广泛的企业级小部件,用于创建图表、仪表、数据网格等。
这些小部件有一个社区和企业许可证,所以你可以找到适合你的项目。
Flutter for Windows在野外
除了针对Windows(以及一般的Flutter桌面)的包和插件,Flutter开发者也一直在针对Windows打造优秀的应用,比如这个来自Invoice Ninja的实验性构建。
Invoice Ninja是一家依靠Flutter带来收入的开票公司。他们今天针对安卓和iOS进行生产,并有一个基于网页的演示供你试用,但也在展望提供桌面版。
"在Invoice Ninja,我们过去一直在努力只支持Web和移动端,一度维护着三个独立的代码库。有了Flutter,以及最近的Flutter Desktop,我们已经能够用单一的代码库为每一个主要平台构建应用程序。我们不仅基本上得到了一个免费的桌面版应用,而且它的性能也是最好的!"
- Hillel Coren,Invoice Ninja联合创始人。
如果你对实现一个能在移动和桌面形态上工作的真实世界、创收的Flutter应用感兴趣,可以在GitHub上找到源代码。
Aartos是另一家正在打造伟大事物的公司,包括一个实时无人机检测系统,其多平台客户端用Flutter编写。这是Windows客户端的早期版本,就在移动客户端旁边运行。
这两个版本,针对iOS和Windows,共享完全相同的代码库。 如果你是一个有经验的Flutter开发者,并且你发现自己在不同版本的Flutter之间切换;例如,一个版本用来发布你的生产移动应用,另一个版本用来实验Windows的alpha,那么你可能会欣赏Flutter版本管理器,它现在带有一个Windows GUI,你可以下载。
这个工具是开源的,所以可以自己看看Leo是如何把它做得这么棒的。
下一步是什么
现在我们已经发布了alpha版本,我们的注意力转移到完成功能集和稳定产品的发布上。作为一个开源项目,你可以在GitHub网站上关注我们的测试版进度,剩余的工作包括无障碍性、全球化和本地化、增强的键盘和文本处理、对命令行参数的支持等。
除了支持经典的Win32 API之外,我们还在试验基于UWP版本的Flutter shell,这使得Flutter可以接触到更多基于Windows的设备,包括Xbox。作为该实验的一部分,本周我们向Windows商店发布了基于UWP版本的Flutter Gallery。
下面的截图显示了在Xbox上运行的基于UWP的Flutter Gallery。
而这是在Windows 10X模拟器上运行的双屏Windows设备上运行的相同应用。
你可以在GitHub上阅读更多关于Flutter for UWP的进展。
总结
通过这个版本,我们将Flutter的强大功能带到了Windows中,它的声明式、可合成、反应式框架提高了开发人员的工作效率,它对Material规范的适应性实现,因此您可以让您的应用程序以您想要的方式进行外观和感觉,以及全套的Flutter开发和调试工具。完成后,您的应用程序将被编译成原生64位代码,您可以像其他原生应用程序一样打包并带到其他Windows机器上。最后,您可以使用相同的代码库来创建针对Android、iOS、web、macOS和Linux的应用程序。
如果您想开始使用Flutter构建Windows应用程序,我们非常希望得到您的反馈! 如果你更喜欢用你的Windows专业知识来构建出流行插件的Windows实现,或者为Flutter构建一些以Windows为中心的工具(也许是一个从flutter build windows
命令的输出中创建MSIXs的CLI......),那也是欢迎的。
随着Flutter对Windows的新支持,你打算构建什么?
通过www.DeepL.com/Translator (免费版)翻译