优雅地处理 Flutter Web 平台上仅限移动设备的插件

nip*_*dha 6 flutter flutter-web

我注意到 Flutter Web(仍处于测试阶段)不支持 、 、 等Flutter插件path_provider。任何人都可以提供一些有关如何在他们支持的平台上使用此插件的见解,并防止他们在不支持的平台上破坏应用程序吗?firebase_messaginggoogle_fonts

  • 是否有任何标准或记录的方法可以在不受支持的平台上优雅地处理插件?
  • 在为不受支持的平台构建时,我可以从 pubspec 中排除插件吗?可能使用某种包装器?
  • 在构建 Web 时,某些 dart 插件附带的 Android 或 iOS 本机代码会发生什么情况?

Chr*_*ore 5

您可以通过条件导入来实现此目的。这个答案提供了一个很好的方法来做到这一点。以下是该帖子的要点:

核心思想如下。

  1. 创建一个抽象类来定义您通常需要使用的方法。
  2. 创建特定于该抽象类的实现webandroid扩展该抽象类的依赖项。
  3. 创建一个存根,它公开一个方法来返回此抽象实现的实例。这只是为了让 dart 分析工具满意。
  4. 在抽象类中导入此存根文件以及特定于mobile和的条件导入web。然后在其工厂构造函数中返回具体实现的实例。如果编写正确,这将通过条件导入自动处理。

此方法允许您根据平台进行这些导入,并适用于可能不支持所有可能的 flutter 平台的所有包(例如 dart:html、dart:js、dart:js_util、dart:io)。这似乎是目前使用相同代码库处理不同平台的最佳方法。

据我所知,您不能有条件地排除插件pubspec.yaml(我当然可能是错的),尽管对于我之前提到的条件导入来说这不是必需的。

当您为 Web 构建时,任何属于您使用的插件一部分的本机 Android 或 iOS 代码都不会包含在内。Android 和 iOS 的情况完全相同。为 Android 构建时,构建应用程序时根本不会考虑 iOS 代码。构建 flutter 应用程序仅编译 dart 代码。除了构建本机应用程序之外,它不会对本机代码执行任何特殊操作。


归档时间:

查看次数:

1805 次

最近记录:

5 年,5 月 前