在联合模型中使用飞镖鸽
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_ios
、my_plugin_android
、my_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
我正在考虑使用 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_ios
、my_plugin_android
、my_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