3、Flutter Multiplatform - desktop;

萧升
2023-12-01

Flutter for Desktop

  Flutter for Desktop最初是为了开发FlutterWindowsmacOSLinux嵌入而创建的项目,这项工作后来成为Flutter的一部分。而此项目现在只是在当前状态下使用这些库构建Flutter应用程序的示例和测试环境,它还包括一些实验性的早期桌面插件。

  Flutter for Desktop仍处于早期阶段。 此项目的代码并不稳定,并且也不适合生产使用

桌面shell

  Flutter team正在开展以扩展Flutter支持桌面应该作为目标的工作,允许开发人员使用Flutter创建macOSWindowsLinux应用程序。

  从长远来看,将创建一个完全集成的解决方案,用于桌面平台的Flutter创建,Flutter运行和Flutter构建工作,但目前此项目仍在进行中。

当前的状态

Flutter桌面API仍处于开发的早期阶段,如有更改,恕不另行通知。 也不会提供APIABI的向后兼容性。 在任何Flutter更新之后,使用这些库的任何代码都需要更新和重新编译。

macOS

  这是最成熟的桌面平台(出于各种原因,包括它与已经支持的iOS非常接近)。

  以Flutter开头的类与iOS共享,应该基本稳定。以FLE开头的类仍处于早期阶段。

Windows

  当前的Windows shellGLFW占位符,以便进行早期实验。它将在未来被Win32UWP shell替换,允许在应用程序中嵌入Flutter视图。最终shellAPI与当前实现将完全不同。

Linux

  当前的Linux shellGLFW占位符,以便进行早期实验。Flutter team计划创建一个库,让你可以嵌入Flutter,无论是使用GTK +QtwxWidgetsMotif还是其他任意用于应用程序的其他部分的工具包,但还没有确定一个好的方案。 所以,目前的计划是支持GTK +,其中添加对其他工具包的支持将非常简单。最终shellAPI与当前实现将完全不同。

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).

预构建的Shell库

  默认情况下,桌面库不会被下载,但可以通过运行带有--linux- macos--windows标志的Flutter预缓存下载到Flutter的引擎工件缓存中,具体取决于开发平台。目前只有debug库可用。

C++ Wrapper

  WindowsLinux库提供了C API。 为了更容易使用它们,可以使用C ++ Wrapper,可以将其构建到应用程序中以提供更高级别的APIprecache命令会将此Wrapper的源代码下载到库旁边的cpp_client_wrapper文件夹中。

使用Shells

  由于flutter create还不支持桌面,因此需要一个runner应用程序。 flutter-desktop-embedding项目为每个桌面平台提供了简单的运行程序,可以使用flutter工具进行这些桌面支持。

  或者,如果熟悉在平台上进行原生开发,则可以使用shell编写自己的应用程序。 有关使用它们的信息,可以参阅适用于平台的库附带的标头。将来会有更多文件; 现在,查看flutter-desktop-embedding示例以查看它是如何使用它们的。 除了链接Flutter库之外,应用程序还需要捆绑您的Flutter assets。 在WindowsLinux上,还需要来自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上使用,但不能在LinuxWindows上使用。

  大多数应用程序需要基于主机平台设置字体(例如,通过ThemeData),或者设置与应用程序捆绑在一起的特定字体。如果没有额外的字体规范(例如,DEBUG横幅的文本),其他不使用ThemeData的小部件可能无法显示。

Tools

  运行flutter doctor,并确保没有报告与平台相关的部分的问题。

  doctorWindowsLinux的支持即将推出; 要求是:

  • Linux:Make,以及最新版本的clang
  • Windows:Visual Studio 20172019,包括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:需要使用操作系统的常规过程为应用程序设置环境变量。 如果设备菜单将开发机器列为设备,该变量就已正确设置。
 类似资料: