Flutter for Desktop
Flutter for Desktop最初是为了开发Flutter
的Windows
,macOS
和Linux
嵌入而创建的项目,这项工作后来成为Flutter的一部分。而此项目现在只是在当前状态下使用这些库构建Flutter
应用程序的示例和测试环境,它还包括一些实验性的早期桌面插件。
Flutter for Desktop
仍处于早期阶段。 此项目的代码并不稳定,并且也不适合生产使用。
桌面shell
Flutter team
正在开展以扩展Flutter
支持桌面应该作为目标的工作,允许开发人员使用Flutter
创建macOS
,Windows
和Linux
应用程序。
从长远来看,将创建一个完全集成的解决方案,用于桌面平台的Flutter
创建,Flutter
运行和Flutter
构建工作,但目前此项目仍在进行中。
当前的状态
Flutter
桌面API
仍处于开发的早期阶段,如有更改,恕不另行通知。 也不会提供API
或ABI
的向后兼容性。 在任何Flutter
更新之后,使用这些库的任何代码都需要更新和重新编译。
macOS
这是最成熟的桌面平台(出于各种原因,包括它与已经支持的iOS非常接近)。
以Flutter
开头的类与iOS
共享,应该基本稳定。以FLE
开头的类仍处于早期阶段。
Windows
当前的Windows shell
是GLFW
占位符,以便进行早期实验。它将在未来被Win32
或UWP shell
替换,允许在应用程序中嵌入Flutter
视图。最终shell
的API
与当前实现将完全不同。
Linux
当前的Linux shell
是GLFW
占位符,以便进行早期实验。Flutter team
计划创建一个库,让你可以嵌入Flutter
,无论是使用GTK +
,Qt
,wxWidgets
,Motif
还是其他任意用于应用程序的其他部分的工具包,但还没有确定一个好的方案。 所以,目前的计划是支持GTK +
,其中添加对其他工具包的支持将非常简单。最终shell
的API
与当前实现将完全不同。
Plugins
所有平台都支持编写插件,但是,目前很少有插件实际上具有桌面支持(例如flutter-desktop-embedding项目中的这些插件)。
Tooling
在Flutter
工具中支持桌面是一项正在进行的工作。要使用任何支持(例如flutter
设备列出的主机),目前必须要求:
- 不能在稳定的
Flutter channel
上。这是为了表明桌面支持尚未被认为是稳定的。- 应该始终及时更新此库和
Flutter
,因为桌面的重大更改经常发生。
- 应该始终及时更新此库和
- 必须将
ENABLE_FLUTTER_DESKTOP
环境变量设置为true
。这是为了避免在制定长期解决方案时干扰现有的移动开发工作流程。- macOS/Linux:
export ENABLE_FLUTTER_DESKTOP=true
- Windows:
$env:ENABLE_FLUTTER_DESKTOP="true"
(PowerShell) 或者set NABLE_FLUTTER_DESKTOP=true
(CMD).
- macOS/Linux:
预构建的Shell库
默认情况下,桌面库不会被下载,但可以通过运行带有--linux
, - macos
或--windows
标志的Flutter
预缓存下载到Flutter的引擎工件缓存中,具体取决于开发平台。目前只有debug
库可用。
C++ Wrapper
Windows
和Linux
库提供了C
API
。 为了更容易使用它们,可以使用C ++ Wrapper
,可以将其构建到应用程序中以提供更高级别的API
。precache
命令会将此Wrapper
的源代码下载到库旁边的cpp_client_wrapper
文件夹中。
使用Shells
由于flutter create
还不支持桌面,因此需要一个runner
应用程序。 flutter-desktop-embedding项目为每个桌面平台提供了简单的运行程序,可以使用flutter
工具进行这些桌面支持。
或者,如果熟悉在平台上进行原生开发,则可以使用shell
编写自己的应用程序。 有关使用它们的信息,可以参阅适用于平台的库附带的标头。将来会有更多文件; 现在,查看flutter-desktop-embedding
示例以查看它是如何使用它们的。 除了链接Flutter
库之外,应用程序还需要捆绑您的Flutter assets
。 在Windows
和Linux
上,还需要来自Flutter
引擎的ICU
数据(在Flutter
文件夹bin/cache/ artifacts/engine
目录下查找icudtl.dat
)。
Plugins
macOS
在设置FLEViewController
之前,在调用launchEngine
之前...,在每个要使用的插件上调用-registerWithRegistrar
: 例如:
[XYZMyAwesomePlugin registerWithRegistrar:
[myFlutterViewController registrarForPlugin:"XYZMyAwesomePlugin"]];
复制代码
Windows/Linux
创建Flutter
窗口控制器后,请调用插件的注册功能。 例如:
MyAwesomePluginRegisterWithRegistrar(
flutter_controller.GetRegistrarForPlugin("MyAwesomePlugin"));
复制代码
Flutter的应用要求
由于Flutter
框架尚未完全支持桌面平台,因此现有的Flutter
应用程序可能需要稍加修改才能运行。
目标平台
大多数应用程序需要将应用程序的目标平台覆盖到其中一个支持的,以避免“未知平台”异常。可以对单个目标进行编码:
import 'package:flutter/foundation.dart'
show debugDefaultTargetPlatformOverride;
[...]
void main() {
debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
[...]
}
复制代码
如果代码需要在移动设备和桌面上运行,或者您希望在不同的桌面平台上运行不同的代码,则可以使用Platform
进行区别。 例如,上面main()
中的行可以替换为:
/// If the current platform is desktop, override the default platform to
/// a supported platform (iOS for macOS, Android for Linux and Windows).
/// Otherwise, do nothing.
void _setTargetPlatformForDesktop() {
TargetPlatform targetPlatform;
if (Platform.isMacOS) {
targetPlatform = TargetPlatform.iOS;
} else if (Platform.isLinux || Platform.isWindows) {
targetPlatform = TargetPlatform.android;
}
if (targetPlatform != null) {
debugDefaultTargetPlatformOverride = targetPlatform;
}
}
复制代码
注意,使用的目标平台不仅会影响窗口小部件的行为和外观,还会影响
Flutter
对平台上的可用内容,例如字体;
Fonts
Flutter
应用程序可能默认为目标平台标准的字体,但在桌面上不可用。例如,如果目标平台是TargetPlatform.iOS
,那么Material
库将默认为San Francisco
,它可以在macOS
上使用,但不能在Linux
或Windows
上使用。
大多数应用程序需要基于主机平台设置字体(例如,通过ThemeData
),或者设置与应用程序捆绑在一起的特定字体。如果没有额外的字体规范(例如,DEBUG横幅的文本),其他不使用ThemeData
的小部件可能无法显示。
Tools
运行flutter doctor
,并确保没有报告与平台相关的部分的问题。
doctor
对Windows
和Linux
的支持即将推出; 要求是:
- Linux:
Make
,以及最新版本的clang
。 - Windows:
Visual Studio 2017
或2019
,包括Desktop development with C++
。
运行git仓库的项目
Example
设置好所有内容后只需在示例目录中运行桌面Flutter
应用程序;
注意:目前只有调试模式可用。 使用
--release
运行会成功,但结果仍然是使用调试Flutter
配置:asserts
将触发等等。
IDEs
如果要使用IDE
在桌面上运行Flutter
项目,则需要为IDE
设置ENABLE_FLUTTER_DESKTOP
:
VS Code
: 在VS Code
settings.json
中添加dart.env
:"dart.env": { "ENABLE_FLUTTER_DESKTOP": true, } 复制代码
IntelliJ / Android Studio
:需要使用操作系统的常规过程为应用程序设置环境变量。 如果设备菜单将开发机器列为设备,该变量就已正确设置。