可以在Flutter中编译条件代码吗?

时间:2019-09-17 11:14:12

标签: flutter flutter-dependencies flutter-web

我想以与Android不同的依赖方式为网络编译Flutter代码。没有支持两者的依赖关系,所以我需要找到另一种方法。

我在网上找到了build.yaml,但我还不了解。也许这对我来说是正确的选择,有人可以帮助我更好地理解它(谢谢:D)。

它应该处于单独的编译阶段,因为如果我为网络编译,则android依赖项会阻止编译。

Skipping compiling pay_balance|lib/main_web_entrypoint.dart with ddc because some of its
transitive libraries have sdk dependencies that not supported on this platform:

firebase_core|lib/firebase_core.dart

https://github.com/dart-lang/build/blob/master/docs/faq.md#how-can-i-resolve-skipped-compiling-warnings

最终结果应该是一个对Web和android具有不同依赖性的代码,并且不能编译另一个。因此,当我为网络开发时,不应编译android依赖项!

1 个答案:

答案 0 :(得分:3)

您必须使用如上所述的条件导入。我最近这样做了,这是这样的:

您将需要一些冗长的文件创建,但还算不错。 my_service.dart-用于导入

my_service_main.dart-由于Dart导入当前的工作方式,将用于取消初始导入

my_service_web.dart-将导入特定于Web的库,例如dart:html,并执行您要实现的Web版本

my_service_mobile.dart-将导入iOS / Android库,例如dart:io,并制作移动版本


  1. 创建这4个文件
  2. 确保每个方法的名称都相同
  3. throw UnsupportedError(来自“主要”版本)
  4. 处理进口

将它们放在一起

// my_service_main.dart

void doTheThing() => throw UnsupportedError('doTheThing Unsupported')

// my_service_web.dart
import 'dart:html' as html;

void doTheThing(){
  // do your thing, use `html`, etc
}

//my_service_mobile.dart
import 'dart:io';

void doTheThing(){
  // do your thing using dart:io
}

// The export file
// my_service.dart

export 'my_service_main.dart'
  if (dart.library.js) 'my_service_web.dart'
  if (dart.library.io) 'my_service_mobile.dart'



// Then in your code you can import
import 'my_service.dart';

void main() {
  doTheThing();
}