我的目标是仅在相应平台上导入特定于平台的代码。一种用例是如果在导入的文件中使用了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中也提到了这一点。
答案 0 :(得分:0)
是的。真正干净,可持续的解决方案是编写federated plugin.插件,不仅供外部使用,其他人可以作为库使用,您可以轻松地将插件放入自己的项目中,以分离出平台特定的代码。 / p>
如果您真的不想这样做,因为您只需要在自己的代码中包含几项,则只需设置通常的接口实现方法即可。使用要使用的接口编写一个抽象类,编写两个(或多个)实现,并有条件地包含一个您需要的实现。我的一个应用程序的摘录:
界面:
// 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()
时一次又一次地实例化它们,请返回单例