在联合模型中使用飞镖鸽

Using dart pigeon in a federated model

我正在考虑使用 pigeon 将 dart 包 (https://pub.dev/packages/sounds) 转换为联合模型。

关于结合这两部分的文档有点稀疏。

查看 video_player 示例 (https://github.com/flutter/plugins/tree/master/packages/video_player/video_player_platform_interface) 似乎暗示了联合模型,因为 Web 平台是独立的。

但是 android 和 ios 包都是主包的一部分。

这只是一个历史产物还是 ios 和 android 包仍然需要成为主插件的一部分?

如果可以将它们分开,正确的包结构是什么?

那么是否有任何在完全联合模型中使用 pigeon 的开源插件可以用作样本?

在主包中包含 iOS 和 Android 项目是目前的标准。我看起来 discussion 在 运行 flutter create.

时生成联合插件

url_launcher federated plugin model refactor 上有一篇文章,对搞清楚 FS 结构很有帮助:

https://medium.com/flutter/how-to-write-a-flutter-web-plugin-part-2-afdddb69ece6

https://github.com/flutter/plugins/tree/master/packages/url_launcher

就Pigeon而言,由于Pigeon在pre-release联邦插件设计相当新,我怀疑是否有任何完全联邦的开源包使用鸽子。但是,您的消息规范似乎属于 my_plugin_platform_interface 包,并且生成的代码将被复制到您的平台特定包中,例如my_plugin_iosmy_plugin_androidmy_plugin_macos

希望有用。

为什么 video_player 的 android 和 iOS 代码没有联合?

Is this just an historical artefact or do the ios and android packages still need to be part of the main plugin?

似乎是:

  • a 便利性flutter create 将使用 android/ios 样板
  • 轻松创建包
  • 历史文物:他们可能在联合插件发布之前创建了包。 (这就是为什么有人要求flutter create plugin模板自动生成federated plugin)

正确的包结构

If they can be separated out what is the correct package(s) structure?

它们是可以分开的。

对于 pigeon 具体而言,您可以将 Dart 生成的代码(来自 Pigeon)放在您的平台特定接口中,并将您的 Native 平台生成的代码(来自 Pigeon)放在您平台特定的包中。

在您的平台特定包中,您应该将其声明为联合插件(参见 docs and url_launcher),其中 url_launcher 是该示例中面向应用的包:

flutter:
  plugin:
    implements: url_launcher
    platforms:
      macos:
        pluginClass: UrlLauncherPlugin
        fileName: url_launcher_macos.dart

示例包

如果你看一下url_launcher,所有平台都有联合插件包。

为什么联邦

创建单独的平台特定包的优点是用户可以覆盖默认实现。对于 video_player,用户无法覆盖 Android 或 iOS 实现,因为它位于面向应用程序的包中。

多读书

写完上面的内容后,我发现了这个 GitHub 问题,它解决了我们很多问题:https://github.com/woodemi/quick_flutter.brick/issues/22