优雅地处理 Flutter 网络平台上的仅限移动设备的插件
Handling mobile only plugins on Flutter web platform gracefully
我注意到 Flutter web(仍处于测试阶段)不支持 path_provider
、firebase_messaging
、google_fonts
等 flutter 插件。谁能提供一些关于如何在支持的平台上使用此插件的见解,并防止他们在不受支持的平台上破坏应用程序?
- 是否有任何标准或记录的方式来优雅地处理不受支持的平台上的插件?
- 在为不受支持的平台构建时,我可以从 pubspec 中排除插件吗?可能正在使用某种包装器?
- 在为 Web 构建时,Android 或 iOS 一些 dart 插件附带的本机代码会发生什么情况?
您可以通过条件导入来完成此操作。 提供了一个很好的方法来做到这一点。以下是post的要点:
The core idea is as follows.
- Create an abstract class to define the methods you will need to use in general.
- Create implementations specific to
web
and android
dependencies which extends this abstract class.
- Create a stub which exposes a method to return the instance of this abstract implementation. This is only to keep the dart analysis tool happy.
- In the abstract class import this stub file along with the conditional imports specific for
mobile
and web
. Then in its factory constructor return the instance of the specific implementation. This will be handled automatically by conditional import if written correctly.
此方法允许您根据平台进行这些导入,并适用于可能不支持所有可能的 flutter 平台的所有包(例如 dart:html、dart:js、dart:js_util , dart:io).这似乎是目前处理具有相同代码库的不同平台的最佳方式。
据我所知,您不能有条件地从 pubspec.yaml
中排除插件(我当然可能是错的),尽管对于我之前提到的条件导入来说这不是必需的。
任何本机 Android 或 iOS 代码是您使用的插件的一部分,在您为 Web 构建时根本不包括在内。 Android 和 iOS 完全相同。为 Android 构建时,iOS 代码在构建应用程序时根本不会被考虑。构建一个 flutter 应用程序只会编译 dart 代码。除了构建本机应用程序会做的事情外,它不会对本机代码做任何特殊的事情。
我注意到 Flutter web(仍处于测试阶段)不支持 path_provider
、firebase_messaging
、google_fonts
等 flutter 插件。谁能提供一些关于如何在支持的平台上使用此插件的见解,并防止他们在不受支持的平台上破坏应用程序?
- 是否有任何标准或记录的方式来优雅地处理不受支持的平台上的插件?
- 在为不受支持的平台构建时,我可以从 pubspec 中排除插件吗?可能正在使用某种包装器?
- 在为 Web 构建时,Android 或 iOS 一些 dart 插件附带的本机代码会发生什么情况?
您可以通过条件导入来完成此操作。
The core idea is as follows.
- Create an abstract class to define the methods you will need to use in general.
- Create implementations specific to
web
andandroid
dependencies which extends this abstract class.- Create a stub which exposes a method to return the instance of this abstract implementation. This is only to keep the dart analysis tool happy.
- In the abstract class import this stub file along with the conditional imports specific for
mobile
andweb
. Then in its factory constructor return the instance of the specific implementation. This will be handled automatically by conditional import if written correctly.
此方法允许您根据平台进行这些导入,并适用于可能不支持所有可能的 flutter 平台的所有包(例如 dart:html、dart:js、dart:js_util , dart:io).这似乎是目前处理具有相同代码库的不同平台的最佳方式。
据我所知,您不能有条件地从 pubspec.yaml
中排除插件(我当然可能是错的),尽管对于我之前提到的条件导入来说这不是必需的。
任何本机 Android 或 iOS 代码是您使用的插件的一部分,在您为 Web 构建时根本不包括在内。 Android 和 iOS 完全相同。为 Android 构建时,iOS 代码在构建应用程序时根本不会被考虑。构建一个 flutter 应用程序只会编译 dart 代码。除了构建本机应用程序会做的事情外,它不会对本机代码做任何特殊的事情。