桌面的 flutter 插件是否必须用特定于平台的语言编写(比如我们使用 C++ 的 windows 和我们使用 Swift 的 mac)

Bla*_*pid 1 windows android dart flutter

美好的一天。

我是扑扑和飞镖的新手,因此将不胜感激

我在 android 目录中有一个当前用 Java 编写的 flutter 插件。我希望相同的插件能够在 Windows 和 mac 等其他平台上运行。我是否必须用 C++ 为 windows 和 Swift 为 macos 重写这个插件,或者我可以使用这些目录中的 java 文件。

如果我可以使用相同的 Java 文件,有人可以让我知道如何将这些文件移动到其他目录,以及我需要为我的 Flutter 应用程序做什么才能为其他平台获取这些插件。

smo*_*gan 5

您想要做的特定事情不起作用可能有两个原因:

  • 桌面平台上的 Flutter 应用程序没有 Java VM,因此您无法使用 Java。
  • Flutter 插件通常存在调用特定平台的功能(或为特定平台编写的第三方 SDK,但效果相同)。camera例如,如果您考虑像这样的插件,即使您忽略语言问题,也无法在 macOS 或 Windows 上调用 Android 相机 API,因为它们不是 Android;他们有完全不同的操作系统相机 API。(有一些例外,比如sqflite包装一个已经跨平台的库,但这不是常态)。

但是,对于您是否必须使用文档中描述的特定语言的一般问题,从技术上讲,答案是否定的:

  • 在 Windows 和 Linux 上,插件(目前)只是具有特定 C 接口的共享库。理论上,您可以使用任何可以编译为 C 兼容共享库的语言编写整个插件,例如 Go 或 Rust(尽管您必须执行自己的方法通道编码/解码)。或者,您可以使用 C++ API 作为薄胶层来处理平台通道,并调用编译为 C 兼容形式的底层代码。
  • 在 macOS 上,插件是一个模块,因此外层必须是 Swift 或 Objective-C。但是,Objective-C 是 C 兼容的,因此在 Objective-C 中只使用方法通道粘合,而在任何具有 C 接口的代码中使用其余代码的相同选项也适用于 macOS。

但是,除非您正在处理现有的跨平台库,否则这可能不是一个好主意。如果您正在编写非特定于平台的新代码用于 Flutter,您几乎总是最好将它作为常规包在 Dart 中编写,它可以在所有当前和未来的 Flutter 平台上运行。