Flutter 平台特定依赖项

Mar*_*ler 5 android ios dart flutter progressive-web-apps

我想使用 Flutter 从单个代码库构建适用于 Android、iOS 和 Web 的应用程序。由于 Web 尚不支持所有 Flutter 插件,因此我必须使用具有依赖项(例如dart:html)的替代方案,而这些依赖项在 Android 和 iOS 上不可用。

如何根据应用程序运行的平台注入正确的实现,而不加载不必要/不可用的包?

Mar*_*ler 3

使用条件导入可以实现这一点。您可以在此处找到语法示例: https: //github.com/dart-lang/site-www/issues/1569。但是,我似乎找不到该语言功能的官方文档。

import 'stub.dart'
    if (dart.library.io) 'io.dart'
    if (dart.library.html) 'html.dart';
Run Code Online (Sandbox Code Playgroud)

stub.dart定义投掷UnsupportedOperationException或类似的方法。这并不重要,因为stub.dart无论如何都不会被导入。分别将实际实现放入io.dart和中html.dart。签名必须与 中的签名匹配stub.dart

您可能只想在程序中的单个点执行此条件导入,因此我强烈建议将所有内容隐藏在除stub.dartcommon.dart在本示例中)之外的其他位置定义的公共接口后面。common.dart然后,您可以在io.dart和 中导入和实现html.dart,并使用条件导入在程序根目录中选择您的实现。这样其他的一切都只需要依赖common.dart