如何导入依赖于 Flutter 平台的 Dart 文件或包?
Posted
技术标签:
【中文标题】如何导入依赖于 Flutter 平台的 Dart 文件或包?【英文标题】:How to import Dart file or package dependent on Flutter platform? 【发布时间】:2020-06-05 18:45:05 【问题描述】:我的目标是仅在相应平台上导入特定于平台的代码。一个用例是例如如果在导入的文件中使用了 dart:html
包,而该文件在 ios 上不可用。另一个特定于平台的 Dart 代码示例:XHR HTTP 请求(仅在浏览器中可用)与其他 HTTP 客户端实现。
以前的失败尝试:
1)
import 'specific_to_web.dart' if (dart.library.html) '';
2)
import 'package:flutter/foundation.dart' show kIsWeb;
import 'specific_to_web.dart' if (kIsWeb) '';
3)
在我正在导入的文件中:
export 'api_channel_grpc_web.dart'
if (dart.library.html) 'api_channel_grpc_raw.dart';
这在 Flutter 问题Dart SDK libraries and Flutter for web 中也有提及。
【问题讨论】:
【参考方案1】:是的。真正干净且可持续的解决方案是编写一个federated plugin. 插件不只是供外部使用,供其他人作为库使用,您可以轻松地将插件放入自己的项目中以分离出特定于平台的代码。
如果您真的不想这样做,因为您自己的代码中只需要几个项目,只需设置通常的接口实现方法。您使用要使用的接口编写一个抽象类,编写两个(或更多)实现,并有条件地包含您需要的一个。我的一个应用程序的摘录:
界面:
// interface.dart
import 'worker.dart' //
if (dart.library.io) 'worker_io.dart'
if (dart.library.html) 'worker_async.dart';
abstract class BackgroundWorker
factory BackgroundWorker() => getWorker();
void sendTo(dynamic message);
基本实现:
// worker.dart
BackgroundWorker getWorker() => throw UnimplementedError('getWorker');
移动实施:
// worker_io.dart
BackgroundWorker getWorker() => BackgroundWorkerIo();
class BackgroundWorkerIo implements BackgroundWorker
@override
void sendTo(dynamic message)
网络实现:
// worker_web.dart
BackgroundWorker getWorker() => BackgroundWorkerWeb();
class BackgroundWorkerWeb implements BackgroundWorker
@override
void sendTo(dynamic message)
要使用它,您只需调用getWorker()
,它将返回所需的实际实现,然后您调用它的方法、函数、字段等等。
哦,虽然我的这段代码不需要它,但如果实现不是那么轻量级,并且您想避免每次调用 getWorker()
时一次又一次地实例化它们,请改为返回一个单例。
【讨论】:
以上是关于如何导入依赖于 Flutter 平台的 Dart 文件或包?的主要内容,如果未能解决你的问题,请参考以下文章
跳过编译 flutter_web|web/main.dart] 因为它的一些库有这个平台不支持的 sdk 依赖项
如何在 Flutter 中实现 App Tracking Transparency