【问题标题】:How to import Dart file or package dependent on Flutter platform?如何导入依赖于 Flutter 平台的 Dart 文件或包?
【发布时间】: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 中也有提及。

【问题讨论】:

    标签: flutter dart


    【解决方案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() 时一次又一次地实例化它们,请改为返回一个单例。

    【讨论】:

      猜你喜欢
      • 2020-03-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2021-09-11
      • 2019-12-12
      • 2020-09-26
      相关资源
      最近更新 更多