如何导入依赖于 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 依赖项

Dart/Flutter 中的依赖关系图?

颤振无法导入`flutter_webrtc.dart`

如何在 Flutter 中实现 App Tracking Transparency

Dart 包版本如何工作以及我应该如何对我的 Flutter 插件进行版本控制?

《Flutter》-- 3.Dart语言