4

假设我有简单的记录器:

void main() {
  var logger = new MyLogger();
  logger.log("hello Dart");
}

我希望此代码在开发模式(VM 检查模式)下运行,但我不希望它在我的生产代码中。我希望它被 dart2js 编译器“摇动”掉。有一些标准的方法吗?

4

2 回答 2

4

您可以将代码嵌入到assert. 断言在生产代码中被忽略,我确定在模式下pub build运行时不会构建到 JS。release

class X {
  X() {
    print('x created');
  }

  void log(String m) {
    print(m);
  }
}

bool log(String m) {
  new X()..log(m);
      return true;
}

void main() {
  assert(() {
    new X()..log('in Assert');
    return true;
  });

  assert(() => log('in Assert')); // use a wrapper function
}

当您创建一个返回的包装器方法时,true您不必每次都显式地执行它。

您也可以看看这个问题如何实现类似功能的预编译器指令

于 2014-06-13T14:52:36.013 回答
2

我将@GünterZöchbauer“断言技巧”放在工厂构造函数中:

class _ProductionPlug implements DebugClass{
  const _ProductionPlug();
  noSuchMethod(_) {} //do nothing
}

class DebugClass{
  static final DebugClass _plug = const _ProductionPlug();
  log(msg){print(msg);}
  DebugClass._(){}
  factory DebugClass(){
    DebugClass instance;
    assert((){
    instance = new DebugClass._();
    return true;
        });
    return instance != null ?  instance :  _plug;
  }
}
void main() {
  print("hello");
  new DebugClass()
    ..log("debugging");
}

这样就没有什么突出的了。

于 2014-06-13T16:28:52.287 回答