如何根据Flutter平台导入Dart文件或软件包?

时间:2020-02-21 10:42:56

标签: flutter dart

我的目标是仅在相应平台上导入特定于平台的代码。一种用例是如果在导入的文件中使用了dart:html包,则在iOS上不可用。特定于平台的Dart代码的另一个示例:XHR HTTP请求(仅在浏览器中可用)与其他H​​TTP客户端实现。

先前失败的尝试:

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 个答案:

答案 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()时一次又一次地实例化它们,请返回单例