众所周知,在开发Flutter时,我们希望通过单一的代码库支持Flutter在各种设备(包括iOS、Android、Windows、Linux、macOS和Web)上的应用,并实现原生编译和游戏级视觉效果。Flutter在Google内部也被广泛用于Assistant、Stadia、CloudSearch和Blogger等项目。除了谷歌,字节跳动、Grab、Nubank、MGMResorts等公司也采用了Flutter,并通过Flutter提高了生产力和灵活性。很多人想知道Flutter在桌面操作系统(包括Windows、macOS和Linux)上的进展:根据调查和GitHub数据,Flutter的桌面支持一直是最受期待的新功能之一。在接下来的几周里,我们将在这方面为您带来更多进展;同时,我们觉得有必要展示各个产品功能团队的成果(最终将集成到完整的项目中),并收集您的反馈。反馈。虽然桌面支持目前在TechPreview中可用,但我们还有很多工作要做。ReleaseMode继macOS之后,我们还为Flutter添加了Windows和Linux系统的ProfileMode(性能模式)和ReleaseMode(发布模式)。例如,如果您正在运行最新版本的Flutter,您现在可以使用flutterbuildwindows命令将您的Flutter应用程序编译为Windows可执行文件。此操作使用我们的生产AOT编译器创建原生x64机器代码,可以分发到未安装Flutter的设备。Windows发布模式https://github.com/flutter/flutter/issues/38477Linux发布模式https://github.com/flutter/flutter/issues/38478AOT编辑器https://en.wikipedia.org/wiki/Ahead-of-time_compilation桌面级体验无论您是构建独立的可执行文件还是Web应用程序,桌面级体验都有其独特的属性:桌面窗口通常处于横向模式并且可以调整大小,输入通常由物理键盘和鼠标完成,而不是通过屏幕键盘和触摸操作,同时,控件也根据不同的屏幕内容密度进行了优化。在框架级别,我们对Flutter进行了多项更改以支持桌面级体验。在最近版本的Flutter中创建新项目时,您会看到默认模板包含对visualDensity属性的引用,它允许控件根据目标平台调整它们的密度,从而在桌面平台上实现更紧密的间距。这方面的一个例子是TextField:它根据指定的密度提供紧凑、紧凑和标准的间距。我们优化了对鼠标和键盘输入的支持,包括原始键码、鼠标右键操作、光标更改和Windows上的滚轮支持。您现在可以查询特定平台(通过Platform类),Windows、macOS和Linux平台都会提供相应的查询结果。在我们的最新版本中,我们添加了一个NavigationRail小部件,专为桌面和平板电脑上的桌面级体验而设计。visualDensityhttps://api.flutter-io.cn/flutter/material/ThemeData/visualDensity.htmlDesktop需要更高的屏幕内容密度https://github.com/flutter/flutter/issues/43350TextFieldhttps://api.flutter-io.cn/flutter/material/TextField-class.html为TextField实现visualDensityhttps://github.com/flutter/flutter/pull/51438在Windows上实现键盘映射https://github.com/flutter/flutter/issues/52264支持光标变化https://github.com/google/flutter-desktop-embedding/issues/376NavigationRailwidgethttps://api.flutter-io.cn/flutter/material/NavigationRail-class.html外部函数接口Dart团队一直在努力改进外部函数接口(ForeignFunctionInterface,FFI)以加快平台集成的进程。对于基于C的API,dart:ffi库提供了一种直接绑定到本地代码的机制;Dart运行时提供了在Dart对象支持的堆上分配内存和调用动态链接库的能力。通过dart实现C语言互操作:ffihttps://dart.cn/guides/libraries/c-interop以下代码片段是Windows系统环境下的简单示例,完全使用Dart代码调用传统的Win32MessageBox()API:typedefMessageBoxNative=Int32Function(IntPtrhWnd,PointerlpText,PointerlpCaption,Int32uType);typedefMessageBoxDart=intFunction(inthWnd,PointerlpText,PointerlpCaption,intuType);finaluser32=DynamicLibrary.open('user32.dll');finalwin32MessageBox=user32.lookupFunction('MessageBoxW');voidshowMessageBox(Stringmessage,Stringcaption)=>win32MessageBox(0,//NoownerwindowUtf16.toUtf16(message),//MessageUtf16.toUt(caption),//Windowtitle0//OKbuttononly);…showMessageBox('TestMessage','WindowCaption');//calljustlikeanyotherDartfunction完整例子https://gist.github.com/timsneath/181092c75864001ca37b1b1495b9b396在上面的例子中,我们通过了两个两个typedef代表na分别是该方法的tive和Dart版本。完成这些定义后,我们就可以通过lookupFunction()方法加载Windows动态链接库(DLL)。lookupFunction()负责将方法签名映射到底层原生入口,DLL负责提供方法的实现。最后,我们可以选择添加一个简单的惯用包装器,使其易于从其他Dart代码访问,结果如下:△使用Win32MessageBoxAPI的Windows简单示例应用程序这你自己:有人可以你想使用的API已经处理好了。您可以阅读我们的官方文档,了解更多有关如何在Flutter中使用FFI的信息。访问常用Win32API的Dart库https://pub.flutter-io.cn/packages/win32官方文档:使用dart:ffi调用native代码https://flutter.cn/docs/development/platform-integration/c-Interop更新插件模型从设计的角度来说,Flutter本身的核心很小。Flutter没有在框架中提供大量内容,而是通过插件和包(直接来自Flutter团队或更广泛的生态系统中的贡献者)实现与底层操作系统的集成。然而,随着Flutter对移动、Web和桌面的支持不断增长,为每个目标平台开发插件变得越来越具有挑战性。一个插件更有可能需要多位在各自平台上具有专业知识的作者合作才能完成开发。一种可行的做法是在核心插件中定义一个通用接口,在各个平台上独立完成具体实现。因此,正如最近一篇关于现代插件开发的博客文章中所述,我们最近重组了我们的插件,使多位作者更容易跨平台协作开发。根据目前的发展,插件现在可以明确声明它们支持的特定平台。博文:现代Flutter插件开发https://medium.com/flutter/modern-flutter-plugin-development-4c3ee015cf5a指定插件支持的平台https://flutter.cn/docs/development/packages-and-plugins/developing-packages#plugin-platforms我们已经开始使用这个模型来构建一些核心插件,你也可以在flutter/plugins仓库中找到一些基于这个共同开发模型的早期例子。flutter/pluginsrepohttps://github.com/flutter/plugins/tree/master/packages/path_provider请注意,Windows和Linux插件API仍在开发中,因此虽然我们鼓励您探索,但它们尚未准备好一般生产环境。我们还致力于将桌面平台标签添加到pub.dev。在Windows上运行:Win32和UWP在Windows上进行开发的有趣之处之一是我们尝试了各种架构方法。在任何平台上,Flutter应用程序实际上都是嵌入在一个小型容器应用程序(即“embedder”)中,类似于Unity等游戏引擎。这个特定于平台的容器应用程序负责提供入口点,协调底层操作系统使用表面渲染、可访问性和输入等服务,并管理消息事件循环。Windows提供了两种不同的方式来创建这个容器应用程序。首先是使用成熟的Win32编程模型来创建Flutter内容的入口;这为Windows7等平台提供了最大的向后兼容性,同时构建了满足许多开发人员期望的标准EXE文件。第二种是现代UWP应用模型,推荐在Windows10上使用。这种方式具有更广阔的想象空间,例如帮助开发者将Flutter支持扩展到Xbox或即将推出的Windows10X操作系统等设备上。Windows10Xhttps://docs.microsoft.com/en-us/dual-screen/windows/get-dev-tools我们一直在与多个社区贡献者合作,探索本文中描述的不同解决方案。同时,我们期待与微软紧密合作,共同完成高质量的解决方案。Surface系列设备正在扩展,现在包括Android和Windows。我们认为Flutter为Microsoft提供了一个非常有吸引力的平台,涵盖了其整个产品线并提供了出色的原生体验。探索桌面体验桌面体验目前仍处于技术预览阶段,API和工具还不稳定。在我们将桌面支持转移到稳定版本之前,还有很多工作要做,包括改进可访问性和本地化支持。如果你想尝试一下,你需要使用开发版本。Windows和Linux支持目前仅在master频道提供,我们也在积极致力于Flutter开发。macOS在开发通道上可用,虽然更稳定,但不建议用于生产环境。您可以在Flutter主通道或开发通道之间切换,然后使用以下任一命令启用对您正在使用的平台的支持:C:\flutter>flutterconfig--enable-windows-desktop$flutterconfig--enable-macos-desktop$flutterconfig--enable-linux-desktop一些积极探索的开发者有“尝鲜”,使用Flutter在桌面环境中创建应用程序。我们看到的首批FluttermacOS桌面应用程序之一包括Sharezone,这是一款针对德国教育市场的学生管理应用程序,最初是作为移动应用程序版本创建的,但最近添加了Web和桌面版本。△SharezoneSchulplan:一款供学生、教育工作者和家长跟踪家庭作业、学习小组、课程表等的应用Sharezonehttps://sharezone.net/在接下来的几周,我们将分享更多关于桌面支持的信息;同时,我们期待听到您的反馈。如果您是插件作者,我们鼓励您开始评估使您的插件适应这些即将推出的桌面平台所需的开发工作;如果您发布了应用程序,请尝试将其作为桌面应用程序运行,并让我们知道您的运行情况。