簡體   English   中英

如何導入依賴於 Flutter 平台的 Dart 文件或包?

[英]How to import Dart file or package dependent on Flutter platform?

我的目標是僅在各自的平台上導入特定於平台的代碼。 一個用例是,例如,如果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 issue Dart SDK library 和 Flutter for web中也提到了這一點。

真正干凈且可持續的解決方案是編寫一個聯合插件。 插件不只是供外部使用,其他人作為庫使用,您可以輕松地將插件放入自己的項目中以分離出特定於平台的代碼。

如果您真的不想這樣做,因為您自己的代碼中只需要幾個項目,只需設置通常的接口實現方法。 您使用要使用的接口編寫一個抽象類,編寫兩個(或更多)實現,並有條件地包含您需要的一個。 我的一個應用程序的摘錄:

界面:

// 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()時一次又一次地實例化它們,請改為返回一個單例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM